diff mbox

linux-generic: shm fix unmap for hugepages

Message ID 1421938855-6814-1-git-send-email-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov Jan. 22, 2015, 3 p.m. UTC
In case of hugepages unmap has to be done with address aligned to
page size. Also unmap() has to be done for address returned by mmap(),
not for aligned address after that.

To reproduce original bug run:
echo 4096 >  /proc/sys/vm/nr_hugepages
make check

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/odp_shared_memory.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Maxim Uvarov Jan. 22, 2015, 3:25 p.m. UTC | #1
On 01/22/2015 06:18 PM, Savolainen, Petri (NSN - FI/Espoo) wrote:
>> -----Original Message-----
>> From: lng-odp-bounces@lists.linaro.org [mailto:lng-odp-
>> bounces@lists.linaro.org] On Behalf Of ext Maxim Uvarov
>> Sent: Thursday, January 22, 2015 5:01 PM
>> To: lng-odp@lists.linaro.org
>> Subject: [lng-odp] [PATCH] linux-generic: shm fix unmap for hugepages
>>
>> In case of hugepages unmap has to be done with address aligned to
>> page size. Also unmap() has to be done for address returned by mmap(),
>> not for aligned address after that.
>>
>> To reproduce original bug run:
>> echo 4096 >  /proc/sys/vm/nr_hugepages
>> make check
>>
>> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
>> ---
>>   platform/linux-generic/odp_shared_memory.c | 8 +++++++-
>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/platform/linux-generic/odp_shared_memory.c b/platform/linux-
>> generic/odp_shared_memory.c
>> index 99c5b40..51eba02 100644
>> --- a/platform/linux-generic/odp_shared_memory.c
>> +++ b/platform/linux-generic/odp_shared_memory.c
>> @@ -134,8 +134,14 @@ int odp_shm_free(odp_shm_t shm)
>>   	odp_spinlock_lock(&odp_shm_tbl->lock);
>>   	shm_block = &odp_shm_tbl->block[i];
>>
>> +#ifdef MAP_HUGETLB
>> +	/* round up alloc size by page */
>> +	alloc_size = (shm_block->size + (shm_block->page_sz - 1))
>> +		      & (-shm_block->page_sz);
> Could you rebase this on top of my two patches. And then move this calculation to shm_reserve() side, so that the same size gets allocated, saved into block->alloc_size, and the freed here.
>
> -Petri

Ok, I saw your patches after I wrote mine. Will rebase it on top.

Maxim.

>
>> +#else
>>   	alloc_size = shm_block->size + shm_block->align;
>> -	ret = munmap(shm_block->addr, alloc_size);
>> +#endif
>> +	ret = munmap(shm_block->addr_orig, alloc_size);
>>   	if (0 != ret) {
>>   		ODP_DBG("odp_shm_free: munmap failed\n");
>>   		odp_spinlock_unlock(&odp_shm_tbl->lock);
>> --
>> 1.8.5.1.163.gd7aced9
>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> http://lists.linaro.org/mailman/listinfo/lng-odp
Mike Holmes Jan. 22, 2015, 3:33 p.m. UTC | #2
Can we add a validation case for this bug, Maxim can that be part of this
patch set, looks fairly simple to add as a second patch

A very quick google suggests that a test case that calls "hugeadm
--explain" or one of the many other options and succeeds might be a good
way for the test case to know if it should run. Possibly better is doing
that test in automake so that it can set a flag for hugepage which will
then modify the list of test cases run.

My quick google did not find a more portable way to know if HP was
available.

Mike

On 22 January 2015 at 10:25, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

> On 01/22/2015 06:18 PM, Savolainen, Petri (NSN - FI/Espoo) wrote:
>
>> -----Original Message-----
>>> From: lng-odp-bounces@lists.linaro.org [mailto:lng-odp-
>>> bounces@lists.linaro.org] On Behalf Of ext Maxim Uvarov
>>> Sent: Thursday, January 22, 2015 5:01 PM
>>> To: lng-odp@lists.linaro.org
>>> Subject: [lng-odp] [PATCH] linux-generic: shm fix unmap for hugepages
>>>
>>> In case of hugepages unmap has to be done with address aligned to
>>> page size. Also unmap() has to be done for address returned by mmap(),
>>> not for aligned address after that.
>>>
>>> To reproduce original bug run:
>>> echo 4096 >  /proc/sys/vm/nr_hugepages
>>> make check
>>>
>>> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
>>> ---
>>>   platform/linux-generic/odp_shared_memory.c | 8 +++++++-
>>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/platform/linux-generic/odp_shared_memory.c
>>> b/platform/linux-
>>> generic/odp_shared_memory.c
>>> index 99c5b40..51eba02 100644
>>> --- a/platform/linux-generic/odp_shared_memory.c
>>> +++ b/platform/linux-generic/odp_shared_memory.c
>>> @@ -134,8 +134,14 @@ int odp_shm_free(odp_shm_t shm)
>>>         odp_spinlock_lock(&odp_shm_tbl->lock);
>>>         shm_block = &odp_shm_tbl->block[i];
>>>
>>> +#ifdef MAP_HUGETLB
>>> +       /* round up alloc size by page */
>>> +       alloc_size = (shm_block->size + (shm_block->page_sz - 1))
>>> +                     & (-shm_block->page_sz);
>>>
>> Could you rebase this on top of my two patches. And then move this
>> calculation to shm_reserve() side, so that the same size gets allocated,
>> saved into block->alloc_size, and the freed here.
>>
>> -Petri
>>
>
> Ok, I saw your patches after I wrote mine. Will rebase it on top.
>
> Maxim.
>
>
>
>>  +#else
>>>         alloc_size = shm_block->size + shm_block->align;
>>> -       ret = munmap(shm_block->addr, alloc_size);
>>> +#endif
>>> +       ret = munmap(shm_block->addr_orig, alloc_size);
>>>         if (0 != ret) {
>>>                 ODP_DBG("odp_shm_free: munmap failed\n");
>>>                 odp_spinlock_unlock(&odp_shm_tbl->lock);
>>> --
>>> 1.8.5.1.163.gd7aced9
>>>
>>>
>>> _______________________________________________
>>> lng-odp mailing list
>>> lng-odp@lists.linaro.org
>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>>
>>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>
Maxim Uvarov Jan. 22, 2015, 3:48 p.m. UTC | #3
On 01/22/2015 06:33 PM, Mike Holmes wrote:
> Can we add a validation case for this bug, Maxim can that be part of 
> this patch set, looks fairly simple to add as a second patch
>

There is test for that. See my v2 patch which includes Petris patches. 
What we need is just add script odp_shm_run which will turn on and turn 
off HP.


> A very quick google suggests that a test case that calls "hugeadm 
> --explain" or one of the many other options and succeeds might be a 
> good way for the test case to know if it should run. Possibly better 
> is doing that test in automake so that it can set a flag for hugepage 
> which will then modify the list of test cases run.
>
I don't think that we need any tool for that with will do "echo 4096 >  
/proc/sys/vm/nr_hugepages". That can be in script.

Maxim.

> My quick google did not find a more portable way to know if HP was 
> available.
>
> Mike
>
> On 22 January 2015 at 10:25, Maxim Uvarov <maxim.uvarov@linaro.org 
> <mailto:maxim.uvarov@linaro.org>> wrote:
>
>     On 01/22/2015 06:18 PM, Savolainen, Petri (NSN - FI/Espoo) wrote:
>
>             -----Original Message-----
>             From: lng-odp-bounces@lists.linaro.org
>             <mailto:lng-odp-bounces@lists.linaro.org> [mailto:lng-odp-
>             <mailto:lng-odp->
>             bounces@lists.linaro.org
>             <mailto:bounces@lists.linaro.org>] On Behalf Of ext Maxim
>             Uvarov
>             Sent: Thursday, January 22, 2015 5:01 PM
>             To: lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>             Subject: [lng-odp] [PATCH] linux-generic: shm fix unmap
>             for hugepages
>
>             In case of hugepages unmap has to be done with address
>             aligned to
>             page size. Also unmap() has to be done for address
>             returned by mmap(),
>             not for aligned address after that.
>
>             To reproduce original bug run:
>             echo 4096 >  /proc/sys/vm/nr_hugepages
>             make check
>
>             Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org
>             <mailto:maxim.uvarov@linaro.org>>
>             ---
>               platform/linux-generic/odp_shared_memory.c | 8 +++++++-
>               1 file changed, 7 insertions(+), 1 deletion(-)
>
>             diff --git a/platform/linux-generic/odp_shared_memory.c
>             b/platform/linux-
>             generic/odp_shared_memory.c
>             index 99c5b40..51eba02 100644
>             --- a/platform/linux-generic/odp_shared_memory.c
>             +++ b/platform/linux-generic/odp_shared_memory.c
>             @@ -134,8 +134,14 @@ int odp_shm_free(odp_shm_t shm)
>                     odp_spinlock_lock(&odp_shm_tbl->lock);
>                     shm_block = &odp_shm_tbl->block[i];
>
>             +#ifdef MAP_HUGETLB
>             +       /* round up alloc size by page */
>             +       alloc_size = (shm_block->size +
>             (shm_block->page_sz - 1))
>             +                     & (-shm_block->page_sz);
>
>         Could you rebase this on top of my two patches. And then move
>         this calculation to shm_reserve() side, so that the same size
>         gets allocated, saved into block->alloc_size, and the freed here.
>
>         -Petri
>
>
>     Ok, I saw your patches after I wrote mine. Will rebase it on top.
>
>     Maxim.
>
>
>
>             +#else
>                     alloc_size = shm_block->size + shm_block->align;
>             -       ret = munmap(shm_block->addr, alloc_size);
>             +#endif
>             +       ret = munmap(shm_block->addr_orig, alloc_size);
>                     if (0 != ret) {
>                             ODP_DBG("odp_shm_free: munmap failed\n");
>                             odp_spinlock_unlock(&odp_shm_tbl->lock);
>             --
>             1.8.5.1.163.gd7aced9
>
>
>             _______________________________________________
>             lng-odp mailing list
>             lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>             http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
>
> -- 
> *Mike Holmes*
> Linaro  Sr Technical Manager
> LNG - ODP
diff mbox

Patch

diff --git a/platform/linux-generic/odp_shared_memory.c b/platform/linux-generic/odp_shared_memory.c
index 99c5b40..51eba02 100644
--- a/platform/linux-generic/odp_shared_memory.c
+++ b/platform/linux-generic/odp_shared_memory.c
@@ -134,8 +134,14 @@  int odp_shm_free(odp_shm_t shm)
 	odp_spinlock_lock(&odp_shm_tbl->lock);
 	shm_block = &odp_shm_tbl->block[i];
 
+#ifdef MAP_HUGETLB
+	/* round up alloc size by page */
+	alloc_size = (shm_block->size + (shm_block->page_sz - 1))
+		      & (-shm_block->page_sz);
+#else
 	alloc_size = shm_block->size + shm_block->align;
-	ret = munmap(shm_block->addr, alloc_size);
+#endif
+	ret = munmap(shm_block->addr_orig, alloc_size);
 	if (0 != ret) {
 		ODP_DBG("odp_shm_free: munmap failed\n");
 		odp_spinlock_unlock(&odp_shm_tbl->lock);