All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
@ 2013-06-18 22:10 Cody P Schafer
  2013-06-19  9:15 ` Srivatsa S. Bhat
  0 siblings, 1 reply; 7+ messages in thread
From: Cody P Schafer @ 2013-06-18 22:10 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Cody P Schafer, Linux MM

__zone_pcp_update() is called via stop_machine(), which already disables
local irq.

Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
---
 mm/page_alloc.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index bac3107..b46b54a 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6179,7 +6179,7 @@ static int __meminit __zone_pcp_update(void *data)
 {
 	struct zone *zone = data;
 	int cpu;
-	unsigned long batch = zone_batchsize(zone), flags;
+	unsigned long batch = zone_batchsize(zone);
 
 	for_each_possible_cpu(cpu) {
 		struct per_cpu_pageset *pset;
@@ -6188,12 +6188,10 @@ static int __meminit __zone_pcp_update(void *data)
 		pset = per_cpu_ptr(zone->pageset, cpu);
 		pcp = &pset->pcp;
 
-		local_irq_save(flags);
 		if (pcp->count > 0)
 			free_pcppages_bulk(zone, pcp->count, pcp);
 		drain_zonestat(zone, pset);
 		setup_pageset(pset, batch);
-		local_irq_restore(flags);
 	}
 	return 0;
 }
-- 
1.8.3.1

--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-18 22:10 [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update() Cody P Schafer
@ 2013-06-19  9:15 ` Srivatsa S. Bhat
  2013-06-19 22:53   ` David Rientjes
  0 siblings, 1 reply; 7+ messages in thread
From: Srivatsa S. Bhat @ 2013-06-19  9:15 UTC (permalink / raw)
  To: Cody P Schafer; +Cc: Andrew Morton, Linux MM

On 06/19/2013 03:40 AM, Cody P Schafer wrote:
> __zone_pcp_update() is called via stop_machine(), which already disables
> local irq.
> 
> Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>

Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>

Regards,
Srivatsa S. Bhat

> ---
>  mm/page_alloc.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index bac3107..b46b54a 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -6179,7 +6179,7 @@ static int __meminit __zone_pcp_update(void *data)
>  {
>  	struct zone *zone = data;
>  	int cpu;
> -	unsigned long batch = zone_batchsize(zone), flags;
> +	unsigned long batch = zone_batchsize(zone);
> 
>  	for_each_possible_cpu(cpu) {
>  		struct per_cpu_pageset *pset;
> @@ -6188,12 +6188,10 @@ static int __meminit __zone_pcp_update(void *data)
>  		pset = per_cpu_ptr(zone->pageset, cpu);
>  		pcp = &pset->pcp;
> 
> -		local_irq_save(flags);
>  		if (pcp->count > 0)
>  			free_pcppages_bulk(zone, pcp->count, pcp);
>  		drain_zonestat(zone, pset);
>  		setup_pageset(pset, batch);
> -		local_irq_restore(flags);
>  	}
>  	return 0;
>  }
> 

--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-19  9:15 ` Srivatsa S. Bhat
@ 2013-06-19 22:53   ` David Rientjes
  2013-06-19 23:06     ` Cody P Schafer
  2013-06-20  6:32     ` Srivatsa S. Bhat
  0 siblings, 2 replies; 7+ messages in thread
From: David Rientjes @ 2013-06-19 22:53 UTC (permalink / raw)
  To: Srivatsa S. Bhat; +Cc: Cody P Schafer, Andrew Morton, Linux MM

On Wed, 19 Jun 2013, Srivatsa S. Bhat wrote:

> > __zone_pcp_update() is called via stop_machine(), which already disables
> > local irq.
> > 
> > Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
> 
> Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
> 

What was reviewed?

> > ---
> >  mm/page_alloc.c | 4 +---
> >  1 file changed, 1 insertion(+), 3 deletions(-)
> > 
> > diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> > index bac3107..b46b54a 100644
> > --- a/mm/page_alloc.c
> > +++ b/mm/page_alloc.c
> > @@ -6179,7 +6179,7 @@ static int __meminit __zone_pcp_update(void *data)
> >  {
> >  	struct zone *zone = data;
> >  	int cpu;
> > -	unsigned long batch = zone_batchsize(zone), flags;
> > +	unsigned long batch = zone_batchsize(zone);
> > 
> >  	for_each_possible_cpu(cpu) {
> >  		struct per_cpu_pageset *pset;
> > @@ -6188,12 +6188,10 @@ static int __meminit __zone_pcp_update(void *data)
> >  		pset = per_cpu_ptr(zone->pageset, cpu);
> >  		pcp = &pset->pcp;
> > 
> > -		local_irq_save(flags);
> >  		if (pcp->count > 0)
> >  			free_pcppages_bulk(zone, pcp->count, pcp);
> >  		drain_zonestat(zone, pset);
> >  		setup_pageset(pset, batch);
> > -		local_irq_restore(flags);

This seems like a fine cleanup because stop_machine() disable irqs, but it 
appears like there is two problems with this function already:

 - it's doing for_each_possible_cpu() internally, why?  local_irq_save()
   works on the local cpu and won't protect
   per_cpu_ptr(zone->pageset, cpu)->pcp of some random cpu, and

 - setup_pageset() is what is ultimately responsible for doing 
   pcp->count = 0 after free_pcppages_bulk(), but what happens if 
   pcp->count is read in between the two on the cpu that has not disabled 
   irqs?

You can't just do

	for_each_possible_cpu(cpu) {
		unsigned long flags;

		local_irq_save(flags);
		...
		local_irq_restore(flags);
	}

This is just disabling irqs locally over and over again, not on the cpu 
you're manipulating in its per-cpu critical section.

I don't think we hit this because onlining and offlining memory isn't a 
very common operation, but it doesn't change the fact that it's broken.

> >  	}
> >  	return 0;
> >  }
> > 

--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-19 22:53   ` David Rientjes
@ 2013-06-19 23:06     ` Cody P Schafer
  2013-06-19 23:17       ` David Rientjes
  2013-06-20  6:32     ` Srivatsa S. Bhat
  1 sibling, 1 reply; 7+ messages in thread
From: Cody P Schafer @ 2013-06-19 23:06 UTC (permalink / raw)
  To: David Rientjes; +Cc: Srivatsa S. Bhat, Andrew Morton, Linux MM

On 06/19/2013 03:53 PM, David Rientjes wrote:
> On Wed, 19 Jun 2013, Srivatsa S. Bhat wrote:
>
>>> __zone_pcp_update() is called via stop_machine(), which already disables
>>> local irq.
>>>
>>>   mm/page_alloc.c | 4 +---
>>>   1 file changed, 1 insertion(+), 3 deletions(-)
>
> This seems like a fine cleanup because stop_machine() disable irqs, but it
> appears like there is two problems with this function already:
>

Re-examining this, I've realized that my previous patchset containing
	"mm/page_alloc: convert zone_pcp_update() to rely on memory barriers 
instead of stop_machine()"

already went through and fixed this up (the right way). So ignore this 
patch.


--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-19 23:06     ` Cody P Schafer
@ 2013-06-19 23:17       ` David Rientjes
  2013-06-19 23:21         ` Cody P Schafer
  0 siblings, 1 reply; 7+ messages in thread
From: David Rientjes @ 2013-06-19 23:17 UTC (permalink / raw)
  To: Cody P Schafer; +Cc: Srivatsa S. Bhat, Andrew Morton, Linux MM

On Wed, 19 Jun 2013, Cody P Schafer wrote:

> Re-examining this, I've realized that my previous patchset containing
> 	"mm/page_alloc: convert zone_pcp_update() to rely on memory barriers
> instead of stop_machine()"
> 
> already went through and fixed this up (the right way). So ignore this patch.
> 

If you're referring to

mm-page_alloc-factor-out-setting-of-pcp-high-and-pcp-batch.patch
mm-page_alloc-prevent-concurrent-updaters-of-pcp-batch-and-high.patch
mm-page_alloc-insert-memory-barriers-to-allow-async-update-of-pcp-batch-and-high.patch
mm-page_alloc-protect-pcp-batch-accesses-with-access_once.patch
mm-page_alloc-convert-zone_pcp_update-to-rely-on-memory-barriers-instead-of-stop_machine.patch
mm-page_alloc-when-handling-percpu_pagelist_fraction-dont-unneedly-recalulate-high.patch
mm-page_alloc-factor-setup_pageset-into-pageset_init-and-pageset_set_batch.patch
mm-page_alloc-relocate-comment-to-be-directly-above-code-it-refers-to.patch
mm-page_alloc-factor-zone_pageset_init-out-of-setup_zone_pageset.patch
mm-page_alloc-in-zone_pcp_update-uze-zone_pageset_init.patch
mm-page_alloc-rename-setup_pagelist_highmark-to-match-naming-of-pageset_set_batch.patch

from -mm then I'll review them separately because they have their own 
issues.  Thanks.

--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-19 23:17       ` David Rientjes
@ 2013-06-19 23:21         ` Cody P Schafer
  0 siblings, 0 replies; 7+ messages in thread
From: Cody P Schafer @ 2013-06-19 23:21 UTC (permalink / raw)
  To: David Rientjes; +Cc: Srivatsa S. Bhat, Andrew Morton, Linux MM

On 06/19/2013 04:17 PM, David Rientjes wrote:
> On Wed, 19 Jun 2013, Cody P Schafer wrote:
>
>> Re-examining this, I've realized that my previous patchset containing
>> 	"mm/page_alloc: convert zone_pcp_update() to rely on memory barriers
>> instead of stop_machine()"
>>
>> already went through and fixed this up (the right way). So ignore this patch.
>>
>
> If you're referring to
>
> mm-page_alloc-factor-out-setting-of-pcp-high-and-pcp-batch.patch
> mm-page_alloc-prevent-concurrent-updaters-of-pcp-batch-and-high.patch
> mm-page_alloc-insert-memory-barriers-to-allow-async-update-of-pcp-batch-and-high.patch
> mm-page_alloc-protect-pcp-batch-accesses-with-access_once.patch
> mm-page_alloc-convert-zone_pcp_update-to-rely-on-memory-barriers-instead-of-stop_machine.patch
> mm-page_alloc-when-handling-percpu_pagelist_fraction-dont-unneedly-recalulate-high.patch
> mm-page_alloc-factor-setup_pageset-into-pageset_init-and-pageset_set_batch.patch
> mm-page_alloc-relocate-comment-to-be-directly-above-code-it-refers-to.patch
> mm-page_alloc-factor-zone_pageset_init-out-of-setup_zone_pageset.patch
> mm-page_alloc-in-zone_pcp_update-uze-zone_pageset_init.patch
> mm-page_alloc-rename-setup_pagelist_highmark-to-match-naming-of-pageset_set_batch.patch
>
> from -mm then I'll review them separately because they have their own
> issues.  Thanks.
>

I am. You may also want to note
mm-page_alloc-dont-re-init-pageset-in-zone_pcp_update.patch

which fixes a bug in that patchset.

--
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>

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

* Re: [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update()
  2013-06-19 22:53   ` David Rientjes
  2013-06-19 23:06     ` Cody P Schafer
@ 2013-06-20  6:32     ` Srivatsa S. Bhat
  1 sibling, 0 replies; 7+ messages in thread
From: Srivatsa S. Bhat @ 2013-06-20  6:32 UTC (permalink / raw)
  To: David Rientjes; +Cc: Cody P Schafer, Andrew Morton, Linux MM

On 06/20/2013 04:23 AM, David Rientjes wrote:
> On Wed, 19 Jun 2013, Srivatsa S. Bhat wrote:
> 
>>> __zone_pcp_update() is called via stop_machine(), which already disables
>>> local irq.
>>>
>>> Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
>>
>> Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
>>
> 
> What was reviewed?
>

See below.
 
>>> ---
>>>  mm/page_alloc.c | 4 +---
>>>  1 file changed, 1 insertion(+), 3 deletions(-)
>>>
>>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>>> index bac3107..b46b54a 100644
>>> --- a/mm/page_alloc.c
>>> +++ b/mm/page_alloc.c
>>> @@ -6179,7 +6179,7 @@ static int __meminit __zone_pcp_update(void *data)
>>>  {
>>>  	struct zone *zone = data;
>>>  	int cpu;
>>> -	unsigned long batch = zone_batchsize(zone), flags;
>>> +	unsigned long batch = zone_batchsize(zone);
>>>
>>>  	for_each_possible_cpu(cpu) {
>>>  		struct per_cpu_pageset *pset;
>>> @@ -6188,12 +6188,10 @@ static int __meminit __zone_pcp_update(void *data)
>>>  		pset = per_cpu_ptr(zone->pageset, cpu);
>>>  		pcp = &pset->pcp;
>>>
>>> -		local_irq_save(flags);
>>>  		if (pcp->count > 0)
>>>  			free_pcppages_bulk(zone, pcp->count, pcp);
>>>  		drain_zonestat(zone, pset);
>>>  		setup_pageset(pset, batch);
>>> -		local_irq_restore(flags);
> 
> This seems like a fine cleanup because stop_machine() disable irqs,

I hope you are not missing the fact that stop_machine() disables irqs
on *all* CPUs.

> but it 
> appears like there is two problems with this function already:
> 
>  - it's doing for_each_possible_cpu() internally, why?  local_irq_save()
>    works on the local cpu and won't protect
>    per_cpu_ptr(zone->pageset, cpu)->pcp of some random cpu, and
> 

stop_machine() allows only _your function_ to run and nothing else, on
the entire system. All other CPUs loop with interrupts disabled until
the function is completed.

>  - setup_pageset() is what is ultimately responsible for doing 
>    pcp->count = 0 after free_pcppages_bulk(), but what happens if 
>    pcp->count is read in between the two on the cpu that has not disabled 
>    irqs?
> 

Nobody can do anything else when this function runs. That's precisely
why its named as stop-*machine*.

> You can't just do
> 
> 	for_each_possible_cpu(cpu) {
> 		unsigned long flags;
> 
> 		local_irq_save(flags);
> 		...
> 		local_irq_restore(flags);
> 	}
> 
> This is just disabling irqs locally over and over again, not on the cpu 
> you're manipulating in its per-cpu critical section.
>

stop-machine() takes care of disabling irqs on every online CPU.
 
> I don't think we hit this because onlining and offlining memory isn't a 
> very common operation, but it doesn't change the fact that it's broken.
>

If __zone_pcp_update() is called only from stop_machine() (and looking at
the current code, that's true), then there is no problem, due to the reasons
explained above.

Regards,
Srivatsa S. Bhat

 

--
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>

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

end of thread, other threads:[~2013-06-20  6:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-18 22:10 [PATCH] mm/page_alloc: remove repetitious local_irq_save() in __zone_pcp_update() Cody P Schafer
2013-06-19  9:15 ` Srivatsa S. Bhat
2013-06-19 22:53   ` David Rientjes
2013-06-19 23:06     ` Cody P Schafer
2013-06-19 23:17       ` David Rientjes
2013-06-19 23:21         ` Cody P Schafer
2013-06-20  6:32     ` Srivatsa S. Bhat

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.