Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754869AbbBQXPO (ORCPT ); Tue, 17 Feb 2015 18:15:14 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:37270 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752778AbbBQXPN (ORCPT ); Tue, 17 Feb 2015 18:15:13 -0500 Date: Tue, 17 Feb 2015 15:15:11 -0800 From: Andrew Morton To: Heinrich Schuchardt Cc: "Kirill A. Shutemov" , Peter Zijlstra , Oleg Nesterov , Rik van Riel , Vladimir Davydov , Thomas Gleixner , David Rientjes , Kees Cook , linux-kernel@vger.kernel.org, Guenter Roeck Subject: Re: [PATCH 1/1 v2] kernel/fork.c: avoid division by zero Message-Id: <20150217151511.95143a25ff83c165f4199d08@linux-foundation.org> In-Reply-To: <1424199698-7607-1-git-send-email-xypron.glpk@gmx.de> References: <1424199698-7607-1-git-send-email-xypron.glpk@gmx.de> X-Mailer: Sylpheed 3.4.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2232 Lines: 68 On Tue, 17 Feb 2015 20:01:38 +0100 Heinrich Schuchardt wrote: > PAGE_SIZE is not guaranteed to be equal to or less than 8 times the > THREAD_SIZE. > > E.g. architecture hexagon may have page size 1M and thread size 4096. > > This would lead to a division by zero. > > The futex implementation assumes that tids fit into the FUTEX_TID_MASK. > This limits the number of allowable threads. > > ... > > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -74,6 +74,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -255,6 +256,8 @@ void __init __weak arch_task_cache_init(void) { } > > void __init fork_init(unsigned long mempages) > { > + u64 temp; That's a really poor name. We should always try to make names meaningful. Here, something like "threads" would be better. > #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR > #ifndef ARCH_MIN_TASKALIGN > #define ARCH_MIN_TASKALIGN L1_CACHE_BYTES > @@ -273,7 +276,16 @@ void __init fork_init(unsigned long mempages) > * value: the thread structures can take up at most half > * of memory. > */ > - max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE); > + temp = div64_u64((u64) mempages * (u64) PAGE_SIZE, > + (u64) THREAD_SIZE * 8UL); > + > + /* > + * The futex code assumes that tids fit into the FUTEX_TID_MASK. > + */ > + if (temp < FUTEX_TID_MASK) > + max_threads = temp; > + else > + max_threads = FUTEX_TID_MASK; Seems rather complicated. How about max_threads = mempages / (8 * THREAD_SIZE); max_threads *= PAGE_SIZE; max_threads = min(max_threads, FUTEX_TID_MASK); And while we're there, I do think the comments need a refresh. What does "the thread structures can take up at most half of memory" mean? And what's the reasoning behind that "8"? I suggest we just delete all that and make a new attempt at explaining why the code is this way. -- 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/