From patchwork Thu Dec 11 20:16:35 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Morton X-Patchwork-Id: 13572 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 2AD1E47527 for ; Fri, 12 Dec 2008 07:18:24 +1100 (EST) X-Original-To: linuxppc-dev@ozlabs.org Delivered-To: linuxppc-dev@ozlabs.org Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "smtp.linux-foundation.org", Issuer "CA Cert Signing Authority" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 08C7A474C1 for ; Fri, 12 Dec 2008 07:18:02 +1100 (EST) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id mBBKGde9018933 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 11 Dec 2008 12:16:40 -0800 Received: from akpm.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id mBBKGZFb016845; Thu, 11 Dec 2008 12:16:37 -0800 Date: Thu, 11 Dec 2008 12:16:35 -0800 From: Andrew Morton To: Yuri Tikhonov Subject: Re: [PATCH][v2] fork_init: fix division by zero Message-Id: <20081211121635.ff58193f.akpm@linux-foundation.org> In-Reply-To: <200812101950.51958.yur@emcraft.com> References: <200812101950.51958.yur@emcraft.com> X-Mailer: Sylpheed version 2.2.4 (GTK+ 2.8.20; i486-pc-linux-gnu) Mime-Version: 1.0 X-Spam-Status: No, hits=-4.906 required=5 tests=AWL, BAYES_00, OSDL_HEADER_SUBJECT_BRACKETED, PATCH_SUBJECT_OSDL X-Spam-Checker-Version: SpamAssassin 3.2.4-osdl_revision__1.47__ X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 Cc: wd@denx.de, dzu@denx.de, linux-kernel@vger.kernel.org, miltonm@bga.com, linuxppc-dev@ozlabs.org, viro@zeniv.linux.org.uk, Geert.Uytterhoeven@sonycom.com, yanok@emcraft.com X-BeenThere: linuxppc-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org On Wed, 10 Dec 2008 19:50:51 +0300 Yuri Tikhonov wrote: > > The following patch fixes divide-by-zero error for the > cases of really big PAGE_SIZEs (e.g. 256KB on ppc44x). > Support for big page sizes on 44x is not present in the > current kernel yet, but coming soon. > > Also this patch fixes the comment for the max_threads > settings, as this didn't match the things actually done > in the code. > > Signed-off-by: Yuri Tikhonov > Signed-off-by: Ilya Yanok > --- > kernel/fork.c | 8 ++++++-- > 1 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/kernel/fork.c b/kernel/fork.c > index 8d6a7dd..638eb7f 100644 > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -181,10 +181,14 @@ void __init fork_init(unsigned long mempages) > > /* > * The default maximum number of threads is set to a safe > - * value: the thread structures can take up at most half > - * of memory. > + * value: the thread structures can take up at most > + * (1/8) part of memory. > */ > +#if (8 * THREAD_SIZE) > PAGE_SIZE > max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE); > +#else > + max_threads = mempages * (PAGE_SIZE / (8 * THREAD_SIZE)); > +#endif The expression you've chosen here can be quite inacccurate, because ((PAGE_SIZE / (8 * THREAD_SIZE)) is a small number. The way to preserve accuracy is max_threads = (mempages * PAGE_SIZE) / (8 * THREAD_SIZE); so how about avoiding the nasty ifdefs and doing --- a/kernel/fork.c~fork_init-fix-division-by-zero +++ a/kernel/fork.c @@ -69,6 +69,7 @@ #include #include #include +#include /* * Protected counters by write_lock_irq(&tasklist_lock) @@ -185,10 +186,15 @@ void __init fork_init(unsigned long memp /* * The default maximum number of threads is set to a safe - * value: the thread structures can take up at most half - * of memory. + * value: the thread structures can take up at most + * (1/8) part of memory. */ - max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE); + { + /* max_threads = (mempages * PAGE_SIZE) / THREAD_SIZE / 8; */ + u64 m = mempages * PAGE_SIZE; + do_div(m, THREAD_SIZE * 8); + max_threads = m; + } /* * we need to allow at least 20 threads to boot a system