All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vaishali Thakkar <vaishali.thakkar@oracle.com>
To: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	n-horiguchi@ah.jp.nec.com, mike.kravetz@oracle.com,
	hillf.zj@alibaba-inc.com, kirill.shutemov@linux.intel.com,
	dave.hansen@linux.intel.com, paul.gortmaker@windriver.com,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm/hugetlb: Fix incorrect proc nr_hugepages value
Date: Wed, 17 Feb 2016 16:00:24 +0530	[thread overview]
Message-ID: <56C44BC0.1000104@oracle.com> (raw)
In-Reply-To: <20160217095935.GA15769@node.shutemov.name>



On Wednesday 17 February 2016 03:29 PM, Kirill A. Shutemov wrote:
> On Wed, Feb 17, 2016 at 01:13:26AM +0530, Vaishali Thakkar wrote:
>> Currently incorrect default hugepage pool size is reported by proc
>> nr_hugepages when number of pages for the default huge page size is
>> specified twice.
>>
>> When multiple huge page sizes are supported, /proc/sys/vm/nr_hugepages
>> indicates the current number of pre-allocated huge pages of the default
>> size. Basically /proc/sys/vm/nr_hugepages displays default_hstate->
>> max_huge_pages and after boot time pre-allocation, max_huge_pages should
>> equal the number of pre-allocated pages (nr_hugepages).
>>
>> Test case:
>>
>> Note that this is specific to x86 architecture.
>>
>> Boot the kernel with command line option 'default_hugepagesz=1G
>> hugepages=X hugepagesz=2M hugepages=Y hugepagesz=1G hugepages=Z'. After
>> boot, 'cat /proc/sys/vm/nr_hugepages' and 'sysctl -a | grep hugepages'
>> returns the value X.  However, dmesg output shows that Z huge pages were
>> pre-allocated.
>>
>> So, the root cause of the problem here is that the global variable
>> default_hstate_max_huge_pages is set if a default huge page size is
>> specified (directly or indirectly) on the command line. After the
>> command line processing in hugetlb_init, if default_hstate_max_huge_pages
>> is set, the value is assigned to default_hstae.max_huge_pages. However,
>> default_hstate.max_huge_pages may have already been set based on the
>> number of pre-allocated huge pages of default_hstate size.
>>
>> The solution to this problem is if hstate->max_huge_pages is already set
>> then it should not set as a result of global max_huge_pages value.
>> Basically if the value of the variable hugepages is set multiple times
>> on a command line for a specific supported hugepagesize then proc layer
>> should consider the last specified value.
>>
>> Signed-off-by: Vaishali Thakkar <vaishali.thakkar@oracle.com>
>> ---
>> The patch contains one line over 80 characters as I think limiting that
>> line to 80 characters makes code look bit ugly. But if anyone is having
>> issue with that then I am fine with limiting it to 80 chracters.
> What about this?
>
> 	if (default_hstate_max_huge_pages && !default_hstate.max_huge_pages)
> 		default_hstate.max_huge_pages =	default_hstate_max_huge_pages;

Yes, it does the same thing. I thought about it. But to me somehow it looks
hard to read. So, personally I don't prefer it.

Do you want me to change this?

>> ---
>>  mm/hugetlb.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
>> index 06ae13e..01f2b48 100644
>> --- a/mm/hugetlb.c
>> +++ b/mm/hugetlb.c
>> @@ -2630,8 +2630,10 @@ static int __init hugetlb_init(void)
>>  			hugetlb_add_hstate(HUGETLB_PAGE_ORDER);
>>  	}
>>  	default_hstate_idx = hstate_index(size_to_hstate(default_hstate_size));
>> -	if (default_hstate_max_huge_pages)
>> -		default_hstate.max_huge_pages = default_hstate_max_huge_pages;
>> +	if (default_hstate_max_huge_pages) {
>> +		if (!default_hstate.max_huge_pages)
>> +			default_hstate.max_huge_pages = default_hstate_max_huge_pages;
>> +	}
>>  
>>  	hugetlb_init_hstates();
>>  	gather_bootmem_prealloc();
>> -- 
>> 2.1.4
>>
>> --
>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>> the body to majordomo@kvack.org.  For more info on Linux MM,
>> see: http://www.linux-mm.org/ .
>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Vaishali

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Vaishali Thakkar <vaishali.thakkar@oracle.com>
To: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	n-horiguchi@ah.jp.nec.com, mike.kravetz@oracle.com,
	hillf.zj@alibaba-inc.com, kirill.shutemov@linux.intel.com,
	dave.hansen@linux.intel.com, paul.gortmaker@windriver.com,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm/hugetlb: Fix incorrect proc nr_hugepages value
Date: Wed, 17 Feb 2016 16:00:24 +0530	[thread overview]
Message-ID: <56C44BC0.1000104@oracle.com> (raw)
In-Reply-To: <20160217095935.GA15769@node.shutemov.name>



On Wednesday 17 February 2016 03:29 PM, Kirill A. Shutemov wrote:
> On Wed, Feb 17, 2016 at 01:13:26AM +0530, Vaishali Thakkar wrote:
>> Currently incorrect default hugepage pool size is reported by proc
>> nr_hugepages when number of pages for the default huge page size is
>> specified twice.
>>
>> When multiple huge page sizes are supported, /proc/sys/vm/nr_hugepages
>> indicates the current number of pre-allocated huge pages of the default
>> size. Basically /proc/sys/vm/nr_hugepages displays default_hstate->
>> max_huge_pages and after boot time pre-allocation, max_huge_pages should
>> equal the number of pre-allocated pages (nr_hugepages).
>>
>> Test case:
>>
>> Note that this is specific to x86 architecture.
>>
>> Boot the kernel with command line option 'default_hugepagesz=1G
>> hugepages=X hugepagesz=2M hugepages=Y hugepagesz=1G hugepages=Z'. After
>> boot, 'cat /proc/sys/vm/nr_hugepages' and 'sysctl -a | grep hugepages'
>> returns the value X.  However, dmesg output shows that Z huge pages were
>> pre-allocated.
>>
>> So, the root cause of the problem here is that the global variable
>> default_hstate_max_huge_pages is set if a default huge page size is
>> specified (directly or indirectly) on the command line. After the
>> command line processing in hugetlb_init, if default_hstate_max_huge_pages
>> is set, the value is assigned to default_hstae.max_huge_pages. However,
>> default_hstate.max_huge_pages may have already been set based on the
>> number of pre-allocated huge pages of default_hstate size.
>>
>> The solution to this problem is if hstate->max_huge_pages is already set
>> then it should not set as a result of global max_huge_pages value.
>> Basically if the value of the variable hugepages is set multiple times
>> on a command line for a specific supported hugepagesize then proc layer
>> should consider the last specified value.
>>
>> Signed-off-by: Vaishali Thakkar <vaishali.thakkar@oracle.com>
>> ---
>> The patch contains one line over 80 characters as I think limiting that
>> line to 80 characters makes code look bit ugly. But if anyone is having
>> issue with that then I am fine with limiting it to 80 chracters.
> What about this?
>
> 	if (default_hstate_max_huge_pages && !default_hstate.max_huge_pages)
> 		default_hstate.max_huge_pages =	default_hstate_max_huge_pages;

Yes, it does the same thing. I thought about it. But to me somehow it looks
hard to read. So, personally I don't prefer it.

Do you want me to change this?

>> ---
>>  mm/hugetlb.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
>> index 06ae13e..01f2b48 100644
>> --- a/mm/hugetlb.c
>> +++ b/mm/hugetlb.c
>> @@ -2630,8 +2630,10 @@ static int __init hugetlb_init(void)
>>  			hugetlb_add_hstate(HUGETLB_PAGE_ORDER);
>>  	}
>>  	default_hstate_idx = hstate_index(size_to_hstate(default_hstate_size));
>> -	if (default_hstate_max_huge_pages)
>> -		default_hstate.max_huge_pages = default_hstate_max_huge_pages;
>> +	if (default_hstate_max_huge_pages) {
>> +		if (!default_hstate.max_huge_pages)
>> +			default_hstate.max_huge_pages = default_hstate_max_huge_pages;
>> +	}
>>  
>>  	hugetlb_init_hstates();
>>  	gather_bootmem_prealloc();
>> -- 
>> 2.1.4
>>
>> --
>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>> the body to majordomo@kvack.org.  For more info on Linux MM,
>> see: http://www.linux-mm.org/ .
>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Vaishali

  reply	other threads:[~2016-02-17 10:31 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-16 19:43 [PATCH] mm/hugetlb: Fix incorrect proc nr_hugepages value Vaishali Thakkar
2016-02-16 19:43 ` Vaishali Thakkar
2016-02-17  3:37 ` Naoya Horiguchi
2016-02-17  3:37   ` Naoya Horiguchi
2016-02-17  9:59 ` Kirill A. Shutemov
2016-02-17  9:59   ` Kirill A. Shutemov
2016-02-17 10:30   ` Vaishali Thakkar [this message]
2016-02-17 10:30     ` Vaishali Thakkar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56C44BC0.1000104@oracle.com \
    --to=vaishali.thakkar@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=hillf.zj@alibaba-inc.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mike.kravetz@oracle.com \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=paul.gortmaker@windriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.