Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752890AbbHSHTI (ORCPT ); Wed, 19 Aug 2015 03:19:08 -0400 Received: from mga11.intel.com ([192.55.52.93]:15659 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752590AbbHSHTE (ORCPT ); Wed, 19 Aug 2015 03:19:04 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,708,1432623600"; d="scan'208";a="628210439" Subject: Re: [Patch V3 2/9] kernel/profile.c: Replace cpu_to_mem() with cpu_to_node() To: David Rientjes References: <1439781546-7217-1-git-send-email-jiang.liu@linux.intel.com> <1439781546-7217-3-git-send-email-jiang.liu@linux.intel.com> Cc: Andrew Morton , Mel Gorman , Mike Galbraith , Peter Zijlstra , "Rafael J . Wysocki" , Tang Chen , Tejun Heo , Tony Luck , linux-mm@kvack.org, linux-hotplug@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org From: Jiang Liu Organization: Intel Message-ID: <55D42DE3.2040506@linux.intel.com> Date: Wed, 19 Aug 2015 15:18:59 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2137 Lines: 58 On 2015/8/18 8:31, David Rientjes wrote: > On Mon, 17 Aug 2015, Jiang Liu wrote: > >> Function profile_cpu_callback() allocates memory without specifying >> __GFP_THISNODE flag, so replace cpu_to_mem() with cpu_to_node() >> because cpu_to_mem() may cause suboptimal memory allocation if >> there's no free memory on the node returned by cpu_to_mem(). >> > > Why is cpu_to_node() better with regard to free memory and NUMA locality? Hi David, Thanks for review. This is a special case pointed out by Tejun. For the imagined topology, A<->B<->X<->C<->D, where A, B, C, D has memory and X is memoryless. Possible fallback lists are: B: [ B, A, C, D] X: [ B, C, A, D] C: [ C, D, B, A] cpu_to_mem(X) will either return B or C. Let's assume it returns B. Then we will use "B: [ B, A, C, D]" to allocate memory for X, which is not the optimal fallback list for X. And cpu_to_node(X) returns X, and "X: [ B, C, A, D]" is the optimal fallback list for X. Thanks! Gerry > >> It's safe to use cpu_to_mem() because build_all_zonelists() also >> builds suitable fallback zonelist for memoryless node. >> > > Why reference that cpu_to_mem() is safe if you're changing away from it? Sorry, it should be cpu_to_node() instead of cpu_to_mem(). > >> Signed-off-by: Jiang Liu >> --- >> kernel/profile.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/kernel/profile.c b/kernel/profile.c >> index a7bcd28d6e9f..d14805bdcc4c 100644 >> --- a/kernel/profile.c >> +++ b/kernel/profile.c >> @@ -336,7 +336,7 @@ static int profile_cpu_callback(struct notifier_block *info, >> switch (action) { >> case CPU_UP_PREPARE: >> case CPU_UP_PREPARE_FROZEN: >> - node = cpu_to_mem(cpu); >> + node = cpu_to_node(cpu); >> per_cpu(cpu_profile_flip, cpu) = 0; >> if (!per_cpu(cpu_profile_hits, cpu)[1]) { >> page = alloc_pages_exact_node(node, -- 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/