From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030237AbXDMUhj (ORCPT ); Fri, 13 Apr 2007 16:37:39 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1030224AbXDMUhj (ORCPT ); Fri, 13 Apr 2007 16:37:39 -0400 Received: from terminus.zytor.com ([192.83.249.54]:59293 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030192AbXDMUhi (ORCPT ); Fri, 13 Apr 2007 16:37:38 -0400 Message-ID: <461FEA0B.40700@zytor.com> Date: Fri, 13 Apr 2007 13:37:31 -0700 From: "H. Peter Anvin" User-Agent: Thunderbird 1.5.0.10 (X11/20070302) MIME-Version: 1.0 To: "H. Peter Anvin" CC: Jeremy Fitzhardinge , Zachary Amsden , Chris Wright , Andi Kleen , "Eric W. Biederman" , Linus Torvalds , Linux Kernel Mailing List Subject: Re: Crash while mapping memory in pagetable_init() (Was: Re: .config) References: <20070413174913.GA25234@ezr.goop.org> <20070413183841.GP10574@sequoia.sous-sol.org> <20070413190552.GQ10574@sequoia.sous-sol.org> <461FD97B.1010203@goop.org> <461FE36D.1050205@vmware.com> <461FE77A.6020307@zytor.com> <461FE7C7.7050204@goop.org> <461FE8EC.3090304@zytor.com> In-Reply-To: <461FE8EC.3090304@zytor.com> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org H. Peter Anvin wrote: > Jeremy Fitzhardinge wrote: >> H. Peter Anvin wrote: >>> Really (pae ? 2M : 1M), in other words, plus the 128K for bootmem. >>> Note that this is creating page tables for, not erasing. To map 2M, >>> we will only use 2K of additional memory (meaning there is 50% chance >>> we end up using an additional 4K page.) >>> >>> So the solution is simply to change INIT_MAP_BEYOND_END in head.S >>> appropriately. >> Like this? Should we bother adding some slop pages for allocations >> which happen before paging_init()? > > Yes, although it really should be sensitive to CONFIG_X86_PAE. > >> >> /* >> * This is how much memory *in addition to the memory covered up to >> - * and including _end* we need mapped initially. We need one bit for >> - * each possible page, but only in low memory, which means >> - * 2^32/4096/8 = 128K worst case (4G/4G split.) >> + * and including _end* we need mapped initially. >> + * We need: >> + * - one bit for each possible page, but only in low memory, which >> means >> + * 2^32/4096/8 = 128K worst case (4G/4G split.) >> + * - enough space to map all low memory, which means >> + * (2^32/4096) / 512 + 4 pages (worst case for PAE) >> * >> * Modulo rounding, each megabyte assigned here requires a kilobyte of >> * memory, which is currently unreclaimed. >> * >> * This should be a multiple of a page. >> */ >> -#define INIT_MAP_BEYOND_END (128*1024) >> +#define INIT_MAP_BEYOND_END (128*1024 + (2048 + 4)*4096) > > I suggest, for clarity and to minimize bloat: > > #ifdef CONFIG_X86_PAE > # define PAGE_TABLE_SIZE ((2048+4)*4096) > #else > # define PAGE_TABLE_SIZE ((1024+1)*4096) > #endif > > #define BOOTMEM_SIZE (128*1024) > > #define INIT_MAP_BEYOND_END (BOOTMEM_SIZE+PAGE_TABLE_SIZE) > Actually, better yet; there is no reason for these to be macros: #ifdef CONFIG_X86_PAE PAGE_TABLE_SIZE = (2048+4)*4096 #else PAGE_TABLE_SIZE = (1024+1)*4096 #endif BOOTMEM_SIZE = 128*1024 INIT_MAP_BEYOND_END = BOOTMEM_SIZE + PAGE_TABLE_SIZE -hpa