From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: Xen-unstable panic: FATAL PAGE FAULT Date: Wed, 01 Sep 2010 08:54:02 +0100 Message-ID: <4C7E22BA02000078000139D1@vpn.id2.novell.com> References: <4C7D484B0200007800013415@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Fraser Cc: MaoXiaoyun , xen devel List-Id: xen-devel@lists.xenproject.org >>> On 31.08.10 at 18:35, Keir Fraser wrote: > On 31/08/2010 17:22, "Jan Beulich" wrote: >=20 >>> Where is even that constraint ensured in the code? I can't see it (I = would >>> have assumed that pfn_pdx_hole_setup() would be ensuring it). >>=20 >> That's somewhat implicit: srat_parse_regions() gets passed an >> address that is at least BOOTSTRAP_DIRECTMAP_END (i.e. 4G). >> Thus srat_parse_regions() starts off with a mask with the lower >> 32 bits all set (only more bits can get set subsequently). Thus >> the earliest zero bit pfn_pdx_hole_setup() can find is bit 20 >> (due to the >> PAGE_SHIFT in the invocation). Consequently >> the smallest chunk where arithmetic is valid really is 4Gb, not >> 256Mb as I first wrote. >=20 > Well, that's a bit too implicit for me. How about we initialise 'j' to > MAX_ORDER in pfn_pdx_hole_setup() with a comment about supporting = page_info > pointer arithmetic within allocatable multi-page regions? >=20 > Something like the appended (but with a code comment)? Yes, that would seem reasonable (and not affecting current behavior). Jan > --- a/xen/arch/x86/x86_64/mm.c Mon Aug 30 14:59:12 2010 +0100 > +++ b/xen/arch/x86/x86_64/mm.c Tue Aug 31 17:34:34 2010 +0100 > @@ -165,7 +165,8 @@ > { > unsigned int i, j, bottom_shift, hole_shift; > =20 > - for ( hole_shift =3D bottom_shift =3D j =3D 0; ; ) > + hole_shift =3D bottom_shift =3D 0; > + for ( j =3D MAX_ORDER-1; ; ) > { > i =3D find_next_zero_bit(&mask, BITS_PER_LONG, j); > j =3D find_next_bit(&mask, BITS_PER_LONG, i);