From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755539AbbFOO1x (ORCPT ); Mon, 15 Jun 2015 10:27:53 -0400 Received: from mail-pd0-f171.google.com ([209.85.192.171]:35220 "EHLO mail-pd0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755779AbbFOO1m (ORCPT ); Mon, 15 Jun 2015 10:27:42 -0400 Date: Mon, 15 Jun 2015 23:26:59 +0900 From: Sergey Senozhatsky To: Peter Zijlstra Cc: Sergey Senozhatsky , Andrew Morton , Tejun Heo , "David S. Miller" , Amir Vadai , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: Re: [PATCH resend] cpumask: don't perform while loop in cpumask_next_and() Message-ID: <20150615142659.GA538@swordfish> References: <1425223323-20180-1-git-send-email-sergey.senozhatsky@gmail.com> <20150615131221.GA12596@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150615131221.GA12596@twins.programming.kicks-ass.net> User-Agent: Mutt/1.5.23+89 (0255b37be491) (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, On (06/15/15 15:12), Peter Zijlstra wrote: > > +++ b/lib/cpumask.c > > @@ -37,10 +37,11 @@ EXPORT_SYMBOL(__next_cpu_nr); > > int cpumask_next_and(int n, const struct cpumask *src1p, > > const struct cpumask *src2p) > > { > > + struct cpumask tmp; > > + > > + if (cpumask_and(&tmp, src1p, src2p)) > > + return cpumask_next(n, &tmp); > > + return nr_cpu_ids; > > } > > EXPORT_SYMBOL(cpumask_next_and); > > Just ran into this; I though we were not supposed to put cpumasks on the > stack because $BIG. ?! Gosh, I didn't think $BIG enough. So, on a _big_ 4096 x86_64 it's like... 64 bytes on stack. That's bad. alloc_cpumask_var()/free_cpumask_var() version just doesn't look like a win (inlined below) so I guess I'll ask to revert. It makes sense on smaller systems, but loses on huge ones. --- lib/cpumask.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/cpumask.c b/lib/cpumask.c index 5f62708..95ce89a 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -16,11 +16,17 @@ int cpumask_next_and(int n, const struct cpumask *src1p, const struct cpumask *src2p) { - struct cpumask tmp; + int ret = nr_cpu_ids; + cpumask_var_t tmp; - if (cpumask_and(&tmp, src1p, src2p)) - return cpumask_next(n, &tmp); - return nr_cpu_ids; + if (!alloc_cpumask_var(&tmp, GFP_KERNEL)) + return ret; + + if (cpumask_and(tmp, src1p, src2p)) + ret = cpumask_next(n, tmp); + + free_cpumask_var(tmp); + return ret; } EXPORT_SYMBOL(cpumask_next_and);