Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754905AbbBRTua (ORCPT ); Wed, 18 Feb 2015 14:50:30 -0500 Received: from mout.gmx.net ([212.227.17.20]:53741 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753027AbbBRTu2 (ORCPT ); Wed, 18 Feb 2015 14:50:28 -0500 Message-ID: <54E4ECFD.6070401@gmx.de> Date: Wed, 18 Feb 2015 20:50:21 +0100 From: Heinrich Schuchardt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.4.0 MIME-Version: 1.0 To: Guenter Roeck , Andrew Morton CC: "Kirill A. Shutemov" , Peter Zijlstra , Oleg Nesterov , Rik van Riel , Vladimir Davydov , Thomas Gleixner , David Rientjes , Kees Cook , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/1 v2] kernel/fork.c: avoid division by zero References: <1424199698-7607-1-git-send-email-xypron.glpk@gmx.de> <20150217151511.95143a25ff83c165f4199d08@linux-foundation.org> <20150218193814.GB32179@roeck-us.net> In-Reply-To: <20150218193814.GB32179@roeck-us.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:vLTdifkVVdBhQghDsEDlN6NWMzbV4+S5qEjtcSNQcZR0x6slj9Y /p3p3/CPTTiVxDzcw//6WfcWH5/xl6ty1cOia59KtNAOszw+puTSottD58bX/edX9lNWKE+ mtIMBOn/UxP9Jc/U1wjYsl1MA7O6KdQYkTu87xQyYwQs2UezfGtMjxG/k/gtQktW65vOD88 TgqvBI4xc/xpG6XcXZxFw== X-UI-Out-Filterresults: notjunk:1; Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2396 Lines: 77 On 18.02.2015 20:38, Guenter Roeck wrote: > On Tue, Feb 17, 2015 at 03:15:11PM -0800, Andrew Morton wrote: >> 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); > > Apparently it is possible that > mempages < 8 * THREAD_SIZE > which would result in max_threads == 0. > > How about the following ? > > max_threads = mempages / DIV_ROUND_UP(8 * THREAD_SIZE, PAGE_SIZE); For PAGE_SIZE 2MB and THREAD_SIZE 4kB this is wrong by factor 64. Best regards Heinrich -- 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/