Hello!

On Jun 3, 2014, at 9:22 PM, David Rientjes wrote:
> 
> @@ -5849,21 +5850,32 @@ int lowmem_reserve_ratio_sysctl_handler(ctl_table 
> *table, int write,
> int percpu_pagelist_fraction_sysctl_handler(ctl_table *table, int write,
>       void __user *buffer, size_t *length, loff_t *ppos)
> {
> +     const int old_percpu_pagelist_fraction = percpu_pagelist_fraction;
>       struct zone *zone;
> -     unsigned int cpu;
>       int ret;
> 
>       ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
> -     if (!write || (ret < 0))
> +     if (!write || ret < 0)
>               return ret;
> 
> +     /* Sanity checking to avoid pcp imbalance */
> +     if (percpu_pagelist_fraction &&
> +         percpu_pagelist_fraction < MIN_PERCPU_PAGELIST_FRACTION) {
> +             percpu_pagelist_fraction = old_percpu_pagelist_fraction;
> +             return -EINVAL;
> +     }
> +
> +     /* No change? */
> +     if (percpu_pagelist_fraction == old_percpu_pagelist_fraction)
> +             return 0;
> +
>       mutex_lock(&pcp_batch_high_lock);
>       for_each_populated_zone(zone) {
> -             unsigned long  high;
> -             high = zone->managed_pages / percpu_pagelist_fraction;
> +             unsigned int cpu;
> +
>               for_each_possible_cpu(cpu)
> -                     pageset_set_high(per_cpu_ptr(zone->pageset, cpu),
> -                                      high);
> +                     pageset_set_high_and_batch(zone,
> +                                     per_cpu_ptr(zone->pageset, cpu));

BTW, I just realized this version is racy (as was the previous one). 
A parallel writer could write a value of 0 while we are in the middle of 
pageset_set_high_and_batch
and it's possible that'll result in division by zero still.
Also it's possible an incorrect value might set for some of the zones.

I imagine we might want to expand the lock area all the way up to before the 
proc_dointvec_minmax call jsut to be extra safe.

>       }
>       mutex_unlock(&pcp_batch_high_lock);
>       return 0;

Bye,
    Oleg
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to