linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
@ 2020-01-19  6:57 Wei Yang
  2020-01-21  1:53 ` Wei Yang
  2020-01-24  7:21 ` Michal Hocko
  0 siblings, 2 replies; 12+ messages in thread
From: Wei Yang @ 2020-01-19  6:57 UTC (permalink / raw)
  To: akpm, yang.shi, jhubbard, vbabka, cl; +Cc: linux-mm, linux-kernel, Wei Yang

If we get here after successfully adding page to list, err would be
1 to indicate the page is queued in the list.

Current code has two problems:

  * on success, 0 is not returned
  * on error, if add_page_for_migratioin() return 1, and the following err1
    from do_move_pages_to_node() is set, the err1 is not returned since err
    is 1

And these behaviors break the user interface.

Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
page is already on the target node").
Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>

---
v2:
  * put more words to explain the error case
---
 mm/migrate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/migrate.c b/mm/migrate.c
index 86873b6f38a7..430fdccc733e 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
 	if (!err1)
 		err1 = store_status(status, start, current_node, i - start);
-	if (!err)
+	if (err >= 0)
 		err = err1;
 out:
 	return err;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-19  6:57 [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero Wei Yang
@ 2020-01-21  1:53 ` Wei Yang
  2020-01-21  2:34   ` Wei Yang
  2020-01-21 19:30   ` Yang Shi
  2020-01-24  7:21 ` Michal Hocko
  1 sibling, 2 replies; 12+ messages in thread
From: Wei Yang @ 2020-01-21  1:53 UTC (permalink / raw)
  To: Wei Yang
  Cc: akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel, mhocko

On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>If we get here after successfully adding page to list, err would be
>1 to indicate the page is queued in the list.
>
>Current code has two problems:
>
>  * on success, 0 is not returned
>  * on error, if add_page_for_migratioin() return 1, and the following err1
>    from do_move_pages_to_node() is set, the err1 is not returned since err
>    is 1
>
>And these behaviors break the user interface.
>
>Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>page is already on the target node").
>Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>
>---
>v2:
>  * put more words to explain the error case
>---
> mm/migrate.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/mm/migrate.c b/mm/migrate.c
>index 86873b6f38a7..430fdccc733e 100644
>--- a/mm/migrate.c
>+++ b/mm/migrate.c
>@@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
> 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
> 	if (!err1)
> 		err1 = store_status(status, start, current_node, i - start);
>-	if (!err)
>+	if (err >= 0)
> 		err = err1;

Ok, as mentioned by Yang and Michal, only err == 0 means no error.

Sounds this regression should be fixed in another place. Let me send out
another patch.

> out:
> 	return err;
>-- 
>2.17.1

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-21  1:53 ` Wei Yang
@ 2020-01-21  2:34   ` Wei Yang
  2020-01-21 19:33     ` John Hubbard
  2020-01-21 19:30   ` Yang Shi
  1 sibling, 1 reply; 12+ messages in thread
From: Wei Yang @ 2020-01-21  2:34 UTC (permalink / raw)
  To: Wei Yang
  Cc: akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel, mhocko

On Tue, Jan 21, 2020 at 09:53:26AM +0800, Wei Yang wrote:
>On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>>If we get here after successfully adding page to list, err would be
>>1 to indicate the page is queued in the list.
>>
>>Current code has two problems:
>>
>>  * on success, 0 is not returned
>>  * on error, if add_page_for_migratioin() return 1, and the following err1
>>    from do_move_pages_to_node() is set, the err1 is not returned since err
>>    is 1
>>
>>And these behaviors break the user interface.
>>
>>Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>>page is already on the target node").
>>Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>>
>>---
>>v2:
>>  * put more words to explain the error case
>>---
>> mm/migrate.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>>diff --git a/mm/migrate.c b/mm/migrate.c
>>index 86873b6f38a7..430fdccc733e 100644
>>--- a/mm/migrate.c
>>+++ b/mm/migrate.c
>>@@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>> 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>> 	if (!err1)
>> 		err1 = store_status(status, start, current_node, i - start);
>>-	if (!err)
>>+	if (err >= 0)
>> 		err = err1;
>
>Ok, as mentioned by Yang and Michal, only err == 0 means no error.
>
>Sounds this regression should be fixed in another place. Let me send out
>another patch.
>

Hmm... I took another look into the case, this fix should work.

But yes, the semantic here is a little confusion. Look forward your comments
here.

>> out:
>> 	return err;
>>-- 
>>2.17.1
>
>-- 
>Wei Yang
>Help you, Help me

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-21  1:53 ` Wei Yang
  2020-01-21  2:34   ` Wei Yang
@ 2020-01-21 19:30   ` Yang Shi
  2020-01-22  0:41     ` Wei Yang
  1 sibling, 1 reply; 12+ messages in thread
From: Yang Shi @ 2020-01-21 19:30 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, jhubbard, vbabka, cl, linux-mm, linux-kernel, mhocko



On 1/20/20 5:53 PM, Wei Yang wrote:
> On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>> If we get here after successfully adding page to list, err would be
>> 1 to indicate the page is queued in the list.
>>
>> Current code has two problems:
>>
>>   * on success, 0 is not returned
>>   * on error, if add_page_for_migratioin() return 1, and the following err1
>>     from do_move_pages_to_node() is set, the err1 is not returned since err
>>     is 1
>>
>> And these behaviors break the user interface.
>>
>> Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>> page is already on the target node").
>> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>>
>> ---
>> v2:
>>   * put more words to explain the error case
>> ---
>> mm/migrate.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/mm/migrate.c b/mm/migrate.c
>> index 86873b6f38a7..430fdccc733e 100644
>> --- a/mm/migrate.c
>> +++ b/mm/migrate.c
>> @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>> 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>> 	if (!err1)
>> 		err1 = store_status(status, start, current_node, i - start);
>> -	if (!err)
>> +	if (err >= 0)
>> 		err = err1;
> Ok, as mentioned by Yang and Michal, only err == 0 means no error.

I think Michal means do_move_pages_to_node() only, 
add_page_for_migration() returns 1 on purpose.

But, actually the syscall may still return > 0 value since err1 might be 
 > 0. Anyway, this is another regression. The patch itself looks correct 
to me.

Acked-by: Yang Shi <yang.shi@linux.alibaba.com>


>
> Sounds this regression should be fixed in another place. Let me send out
> another patch.
>
>> out:
>> 	return err;
>> -- 
>> 2.17.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-21  2:34   ` Wei Yang
@ 2020-01-21 19:33     ` John Hubbard
  2020-01-22  0:42       ` Wei Yang
  0 siblings, 1 reply; 12+ messages in thread
From: John Hubbard @ 2020-01-21 19:33 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, yang.shi, vbabka, cl, linux-mm, linux-kernel, mhocko

On 1/20/20 6:34 PM, Wei Yang wrote:
> On Tue, Jan 21, 2020 at 09:53:26AM +0800, Wei Yang wrote:
>> On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>>> If we get here after successfully adding page to list, err would be
>>> 1 to indicate the page is queued in the list.
>>>
>>> Current code has two problems:
>>>
>>>   * on success, 0 is not returned
>>>   * on error, if add_page_for_migratioin() return 1, and the following err1
>>>     from do_move_pages_to_node() is set, the err1 is not returned since err
>>>     is 1
>>>
>>> And these behaviors break the user interface.
>>>
>>> Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>>> page is already on the target node").

The Fixes tag should be different, right? Because I don't think that
commit introduced this problem.

thanks,
--
John Hubbard
NVIDIA

>>> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>>>
>>> ---
>>> v2:
>>>   * put more words to explain the error case
>>> ---
>>> mm/migrate.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/mm/migrate.c b/mm/migrate.c
>>> index 86873b6f38a7..430fdccc733e 100644
>>> --- a/mm/migrate.c
>>> +++ b/mm/migrate.c
>>> @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>>> 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>>> 	if (!err1)
>>> 		err1 = store_status(status, start, current_node, i - start);
>>> -	if (!err)
>>> +	if (err >= 0)
>>> 		err = err1;
>>
>> Ok, as mentioned by Yang and Michal, only err == 0 means no error.
>>
>> Sounds this regression should be fixed in another place. Let me send out
>> another patch.
>>
> 
> Hmm... I took another look into the case, this fix should work.
> 
> But yes, the semantic here is a little confusion. Look forward your comments
> here.
> 
>>> out:
>>> 	return err;
>>> -- 
>>> 2.17.1
>>
>> -- 
>> Wei Yang
>> Help you, Help me
> 

thanks,
-- 
John Hubbard
NVIDIA

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-21 19:30   ` Yang Shi
@ 2020-01-22  0:41     ` Wei Yang
  0 siblings, 0 replies; 12+ messages in thread
From: Wei Yang @ 2020-01-22  0:41 UTC (permalink / raw)
  To: Yang Shi
  Cc: Wei Yang, akpm, jhubbard, vbabka, cl, linux-mm, linux-kernel, mhocko

On Tue, Jan 21, 2020 at 11:30:03AM -0800, Yang Shi wrote:
>
>
>On 1/20/20 5:53 PM, Wei Yang wrote:
>> On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>> > If we get here after successfully adding page to list, err would be
>> > 1 to indicate the page is queued in the list.
>> > 
>> > Current code has two problems:
>> > 
>> >   * on success, 0 is not returned
>> >   * on error, if add_page_for_migratioin() return 1, and the following err1
>> >     from do_move_pages_to_node() is set, the err1 is not returned since err
>> >     is 1
>> > 
>> > And these behaviors break the user interface.
>> > 
>> > Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>> > page is already on the target node").
>> > Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>> > 
>> > ---
>> > v2:
>> >   * put more words to explain the error case
>> > ---
>> > mm/migrate.c | 2 +-
>> > 1 file changed, 1 insertion(+), 1 deletion(-)
>> > 
>> > diff --git a/mm/migrate.c b/mm/migrate.c
>> > index 86873b6f38a7..430fdccc733e 100644
>> > --- a/mm/migrate.c
>> > +++ b/mm/migrate.c
>> > @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>> > 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>> > 	if (!err1)
>> > 		err1 = store_status(status, start, current_node, i - start);
>> > -	if (!err)
>> > +	if (err >= 0)
>> > 		err = err1;
>> Ok, as mentioned by Yang and Michal, only err == 0 means no error.
>
>I think Michal means do_move_pages_to_node() only, add_page_for_migration()
>returns 1 on purpose.
>
>But, actually the syscall may still return > 0 value since err1 might be > 0.
>Anyway, this is another regression. The patch itself looks correct to me.
>
>Acked-by: Yang Shi <yang.shi@linux.alibaba.com>
>

Thanks

>
>> 
>> Sounds this regression should be fixed in another place. Let me send out
>> another patch.
>> 
>> > out:
>> > 	return err;
>> > -- 
>> > 2.17.1

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-21 19:33     ` John Hubbard
@ 2020-01-22  0:42       ` Wei Yang
  2020-01-22  1:29         ` John Hubbard
  0 siblings, 1 reply; 12+ messages in thread
From: Wei Yang @ 2020-01-22  0:42 UTC (permalink / raw)
  To: John Hubbard
  Cc: Wei Yang, akpm, yang.shi, vbabka, cl, linux-mm, linux-kernel, mhocko

On Tue, Jan 21, 2020 at 11:33:16AM -0800, John Hubbard wrote:
>On 1/20/20 6:34 PM, Wei Yang wrote:
>> On Tue, Jan 21, 2020 at 09:53:26AM +0800, Wei Yang wrote:
>> > On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>> > > If we get here after successfully adding page to list, err would be
>> > > 1 to indicate the page is queued in the list.
>> > > 
>> > > Current code has two problems:
>> > > 
>> > >   * on success, 0 is not returned
>> > >   * on error, if add_page_for_migratioin() return 1, and the following err1
>> > >     from do_move_pages_to_node() is set, the err1 is not returned since err
>> > >     is 1
>> > > 
>> > > And these behaviors break the user interface.
>> > > 
>> > > Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>> > > page is already on the target node").
>
>The Fixes tag should be different, right? Because I don't think that
>commit introduced this problem.

This is the correct one.

Before this, we don't return 1 from add_page_for_migration().

>
>thanks,
>--
>John Hubbard
>NVIDIA
>
>> > > Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>> > > 
>> > > ---
>> > > v2:
>> > >   * put more words to explain the error case
>> > > ---
>> > > mm/migrate.c | 2 +-
>> > > 1 file changed, 1 insertion(+), 1 deletion(-)
>> > > 
>> > > diff --git a/mm/migrate.c b/mm/migrate.c
>> > > index 86873b6f38a7..430fdccc733e 100644
>> > > --- a/mm/migrate.c
>> > > +++ b/mm/migrate.c
>> > > @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>> > > 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>> > > 	if (!err1)
>> > > 		err1 = store_status(status, start, current_node, i - start);
>> > > -	if (!err)
>> > > +	if (err >= 0)
>> > > 		err = err1;
>> > 
>> > Ok, as mentioned by Yang and Michal, only err == 0 means no error.
>> > 
>> > Sounds this regression should be fixed in another place. Let me send out
>> > another patch.
>> > 
>> 
>> Hmm... I took another look into the case, this fix should work.
>> 
>> But yes, the semantic here is a little confusion. Look forward your comments
>> here.
>> 
>> > > out:
>> > > 	return err;
>> > > -- 
>> > > 2.17.1
>> > 
>> > -- 
>> > Wei Yang
>> > Help you, Help me
>> 
>
>thanks,
>-- 
>John Hubbard
>NVIDIA

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-22  0:42       ` Wei Yang
@ 2020-01-22  1:29         ` John Hubbard
  0 siblings, 0 replies; 12+ messages in thread
From: John Hubbard @ 2020-01-22  1:29 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, yang.shi, vbabka, cl, linux-mm, linux-kernel, mhocko

On 1/21/20 4:42 PM, Wei Yang wrote:
> On Tue, Jan 21, 2020 at 11:33:16AM -0800, John Hubbard wrote:
>> On 1/20/20 6:34 PM, Wei Yang wrote:
>>> On Tue, Jan 21, 2020 at 09:53:26AM +0800, Wei Yang wrote:
>>>> On Sun, Jan 19, 2020 at 02:57:53PM +0800, Wei Yang wrote:
>>>>> If we get here after successfully adding page to list, err would be
>>>>> 1 to indicate the page is queued in the list.
>>>>>
>>>>> Current code has two problems:
>>>>>
>>>>>   * on success, 0 is not returned
>>>>>   * on error, if add_page_for_migratioin() return 1, and the following err1
>>>>>     from do_move_pages_to_node() is set, the err1 is not returned since err
>>>>>     is 1
>>>>>
>>>>> And these behaviors break the user interface.
>>>>>
>>>>> Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>>>>> page is already on the target node").
>>
>> The Fixes tag should be different, right? Because I don't think that
>> commit introduced this problem.
> 
> This is the correct one.
> 
> Before this, we don't return 1 from add_page_for_migration().
> 

OK, then. :)

thanks,
-- 
John Hubbard
NVIDIA

>>
>>>>> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>>>>>
>>>>> ---
>>>>> v2:
>>>>>   * put more words to explain the error case
>>>>> ---
>>>>> mm/migrate.c | 2 +-
>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/mm/migrate.c b/mm/migrate.c
>>>>> index 86873b6f38a7..430fdccc733e 100644
>>>>> --- a/mm/migrate.c
>>>>> +++ b/mm/migrate.c
>>>>> @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>>>>> 	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>>>>> 	if (!err1)
>>>>> 		err1 = store_status(status, start, current_node, i - start);
>>>>> -	if (!err)
>>>>> +	if (err >= 0)
>>>>> 		err = err1;
>>>>
>>>> Ok, as mentioned by Yang and Michal, only err == 0 means no error.
>>>>
>>>> Sounds this regression should be fixed in another place. Let me send out
>>>> another patch.
>>>>
>>>
>>> Hmm... I took another look into the case, this fix should work.
>>>
>>> But yes, the semantic here is a little confusion. Look forward your comments
>>> here.
>>>
>>>>> out:
>>>>> 	return err;
>>>>> -- 
>>>>> 2.17.1
>>>>
>>>> -- 
>>>> Wei Yang
>>>> Help you, Help me
>>>
>>
>> thanks,
>> -- 
>> John Hubbard
>> NVIDIA
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-19  6:57 [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero Wei Yang
  2020-01-21  1:53 ` Wei Yang
@ 2020-01-24  7:21 ` Michal Hocko
  2020-01-24 14:15   ` Wei Yang
  1 sibling, 1 reply; 12+ messages in thread
From: Michal Hocko @ 2020-01-24  7:21 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel

[Sorry I have missed this patch previously]

On Sun 19-01-20 14:57:53, Wei Yang wrote:
> If we get here after successfully adding page to list, err would be
> 1 to indicate the page is queued in the list.
> 
> Current code has two problems:
> 
>   * on success, 0 is not returned
>   * on error, if add_page_for_migratioin() return 1, and the following err1
>     from do_move_pages_to_node() is set, the err1 is not returned since err
>     is 1

This made my really scratch my head to grasp. So essentially err > 0
will happen when we reach the end of the loop and rely on the
out_flush flushing to migrate the batch. Then err contains the
add_page_for_migratioin return value. And that would leak to the
userspace.

What would you say about the following wording instead?
"
out_flush part of do_pages_move is responsible for migrating the last
batch that accumulated while processing the input in the loop.
do_move_pages_to_node return value is supposed to override any
preexisting error (e.g. when the user input is garbage) but the current
logic is wrong because add_page_for_migration returns 1 when
successfully adding a page into the batch and therefore this will be the
last err value after the loop is processed without any actual error.
We want to override that value of course because do_pages_move would
return 1 to the userspace even without any errors.
"

> And these behaviors break the user interface.
> 
> Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
> page is already on the target node").
> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>

Acked-by: Michal Hocko <mhocko@suse.com>

> 
> ---
> v2:
>   * put more words to explain the error case
> ---
>  mm/migrate.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 86873b6f38a7..430fdccc733e 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>  	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>  	if (!err1)
>  		err1 = store_status(status, start, current_node, i - start);
> -	if (!err)
> +	if (err >= 0)
>  		err = err1;
>  out:
>  	return err;
> -- 
> 2.17.1
> 

-- 
Michal Hocko
SUSE Labs

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-24  7:21 ` Michal Hocko
@ 2020-01-24 14:15   ` Wei Yang
  2020-01-24 14:46     ` Michal Hocko
  0 siblings, 1 reply; 12+ messages in thread
From: Wei Yang @ 2020-01-24 14:15 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Wei Yang, akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel

On Fri, Jan 24, 2020 at 08:21:27AM +0100, Michal Hocko wrote:
>[Sorry I have missed this patch previously]
>

No problem, thanks for your comment.

>On Sun 19-01-20 14:57:53, Wei Yang wrote:
>> If we get here after successfully adding page to list, err would be
>> 1 to indicate the page is queued in the list.
>> 
>> Current code has two problems:
>> 
>>   * on success, 0 is not returned
>>   * on error, if add_page_for_migratioin() return 1, and the following err1
>>     from do_move_pages_to_node() is set, the err1 is not returned since err
>>     is 1
>
>This made my really scratch my head to grasp. So essentially err > 0
>will happen when we reach the end of the loop and rely on the
>out_flush flushing to migrate the batch. Then err contains the
>add_page_for_migratioin return value. And that would leak to the
>userspace.
>
>What would you say about the following wording instead?
>"
>out_flush part of do_pages_move is responsible for migrating the last
>batch that accumulated while processing the input in the loop.
>do_move_pages_to_node return value is supposed to override any
>preexisting error (e.g. when the user input is garbage) but the current

I am afraid I have a different understanding here.

If we jump to out_flush on the test of node_isset(), err is -EACCESS. Current
logic would return this instead of the error from do_move_pages_to_node().
Seems we don't override -EACCESS.

Is my understanding correct?

>logic is wrong because add_page_for_migration returns 1 when
>successfully adding a page into the batch and therefore this will be the
>last err value after the loop is processed without any actual error.
>We want to override that value of course because do_pages_move would
>return 1 to the userspace even without any errors.
>"
>
>> And these behaviors break the user interface.
>> 
>> Fixes: e0153fc2c760 ("mm: move_pages: return valid node id in status if the
>> page is already on the target node").
>> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>
>Acked-by: Michal Hocko <mhocko@suse.com>
>
>> 
>> ---
>> v2:
>>   * put more words to explain the error case
>> ---
>>  mm/migrate.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/mm/migrate.c b/mm/migrate.c
>> index 86873b6f38a7..430fdccc733e 100644
>> --- a/mm/migrate.c
>> +++ b/mm/migrate.c
>> @@ -1676,7 +1676,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
>>  	err1 = do_move_pages_to_node(mm, &pagelist, current_node);
>>  	if (!err1)
>>  		err1 = store_status(status, start, current_node, i - start);
>> -	if (!err)
>> +	if (err >= 0)
>>  		err = err1;
>>  out:
>>  	return err;
>> -- 
>> 2.17.1
>> 
>
>-- 
>Michal Hocko
>SUSE Labs

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-24 14:15   ` Wei Yang
@ 2020-01-24 14:46     ` Michal Hocko
  2020-01-24 15:28       ` Wei Yang
  0 siblings, 1 reply; 12+ messages in thread
From: Michal Hocko @ 2020-01-24 14:46 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel

On Fri 24-01-20 22:15:38, Wei Yang wrote:
> On Fri, Jan 24, 2020 at 08:21:27AM +0100, Michal Hocko wrote:
> >[Sorry I have missed this patch previously]
> >
> 
> No problem, thanks for your comment.
> 
> >On Sun 19-01-20 14:57:53, Wei Yang wrote:
> >> If we get here after successfully adding page to list, err would be
> >> 1 to indicate the page is queued in the list.
> >> 
> >> Current code has two problems:
> >> 
> >>   * on success, 0 is not returned
> >>   * on error, if add_page_for_migratioin() return 1, and the following err1
> >>     from do_move_pages_to_node() is set, the err1 is not returned since err
> >>     is 1
> >
> >This made my really scratch my head to grasp. So essentially err > 0
> >will happen when we reach the end of the loop and rely on the
> >out_flush flushing to migrate the batch. Then err contains the
> >add_page_for_migratioin return value. And that would leak to the
> >userspace.
> >
> >What would you say about the following wording instead?
> >"
> >out_flush part of do_pages_move is responsible for migrating the last
> >batch that accumulated while processing the input in the loop.
> >do_move_pages_to_node return value is supposed to override any
> >preexisting error (e.g. when the user input is garbage) but the current
> 
> I am afraid I have a different understanding here.
> 
> If we jump to out_flush on the test of node_isset(), err is -EACCESS. Current
> logic would return this instead of the error from do_move_pages_to_node().
> Seems we don't override -EACCESS.

And this is the expected logic. The unexpected behavior is the one you
have fixed by this patch because err = 1 wouldn't get overriden and that
should have been.
-- 
Michal Hocko
SUSE Labs

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero
  2020-01-24 14:46     ` Michal Hocko
@ 2020-01-24 15:28       ` Wei Yang
  0 siblings, 0 replies; 12+ messages in thread
From: Wei Yang @ 2020-01-24 15:28 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Wei Yang, akpm, yang.shi, jhubbard, vbabka, cl, linux-mm, linux-kernel

On Fri, Jan 24, 2020 at 03:46:43PM +0100, Michal Hocko wrote:
>On Fri 24-01-20 22:15:38, Wei Yang wrote:
>> On Fri, Jan 24, 2020 at 08:21:27AM +0100, Michal Hocko wrote:
>> >[Sorry I have missed this patch previously]
>> >
>> 
>> No problem, thanks for your comment.
>> 
>> >On Sun 19-01-20 14:57:53, Wei Yang wrote:
>> >> If we get here after successfully adding page to list, err would be
>> >> 1 to indicate the page is queued in the list.
>> >> 
>> >> Current code has two problems:
>> >> 
>> >>   * on success, 0 is not returned
>> >>   * on error, if add_page_for_migratioin() return 1, and the following err1
>> >>     from do_move_pages_to_node() is set, the err1 is not returned since err
>> >>     is 1
>> >
>> >This made my really scratch my head to grasp. So essentially err > 0
>> >will happen when we reach the end of the loop and rely on the
>> >out_flush flushing to migrate the batch. Then err contains the
>> >add_page_for_migratioin return value. And that would leak to the
>> >userspace.
>> >
>> >What would you say about the following wording instead?
>> >"
>> >out_flush part of do_pages_move is responsible for migrating the last
>> >batch that accumulated while processing the input in the loop.
>> >do_move_pages_to_node return value is supposed to override any
>> >preexisting error (e.g. when the user input is garbage) but the current
>> 
>> I am afraid I have a different understanding here.
>> 
>> If we jump to out_flush on the test of node_isset(), err is -EACCESS. Current
>> logic would return this instead of the error from do_move_pages_to_node().
>> Seems we don't override -EACCESS.
>
>And this is the expected logic. The unexpected behavior is the one you
>have fixed by this patch because err = 1 wouldn't get overriden and that
>should have been.

Ok, if the sentence cover this case, the wording looks good to me.

Thanks :-)

>-- 
>Michal Hocko
>SUSE Labs

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2020-01-24 15:28 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-19  6:57 [Patch v2] mm/migrate.c: also overwrite error when it is bigger than zero Wei Yang
2020-01-21  1:53 ` Wei Yang
2020-01-21  2:34   ` Wei Yang
2020-01-21 19:33     ` John Hubbard
2020-01-22  0:42       ` Wei Yang
2020-01-22  1:29         ` John Hubbard
2020-01-21 19:30   ` Yang Shi
2020-01-22  0:41     ` Wei Yang
2020-01-24  7:21 ` Michal Hocko
2020-01-24 14:15   ` Wei Yang
2020-01-24 14:46     ` Michal Hocko
2020-01-24 15:28       ` Wei Yang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).