Message ID | f6aa622dc5acfd3ab9b1360973c0d15b3972c6b6.1396001532.git.viresh.kumar@linaro.org |
---|---|
State | New |
Headers | show |
On Fri, Mar 28, 2014 at 03:44:24PM +0530, Viresh Kumar wrote: > Few drivers are using kmalloc() to allocate memory for frequency tables and once > we have an additional field '.flags' in 'struct cpufreq_frequency_table', these > might become unstable. Better get these fixed by replacing kmalloc() by > kzalloc() instead. > > Along with that we also remove use of .driver_data from SPEAr driver as it > doesn't use it at all. Also, writing zero to .driver_data is not required for > powernow-k8 as it is already zero. > > Reported-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > --- > @Rafael: Please apply this one before: > > http://permalink.gmane.org/gmane.linux.kernel/1673994 > > so that git bisect doesn't break. Though the chances of this field getting > initialized to a value equal to BOOST, i.e. 0x1 are very rare. > > drivers/cpufreq/acpi-cpufreq.c | 2 +- > drivers/cpufreq/ia64-acpi-cpufreq.c | 2 +- > drivers/cpufreq/longhaul.c | 2 +- > drivers/cpufreq/powernow-k8.c | 5 ++--- > drivers/cpufreq/s3c24xx-cpufreq.c | 4 ++-- > drivers/cpufreq/spear-cpufreq.c | 7 ++----- > 6 files changed, 9 insertions(+), 13 deletions(-) > > diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c > index d5eaedb..000e4e0 100644 > --- a/drivers/cpufreq/acpi-cpufreq.c > +++ b/drivers/cpufreq/acpi-cpufreq.c > @@ -754,7 +754,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) > goto err_unreg; > } > > - data->freq_table = kmalloc(sizeof(*data->freq_table) * > + data->freq_table = kzalloc(sizeof(*data->freq_table) * > (perf->state_count+1), GFP_KERNEL); > if (!data->freq_table) { > result = -ENOMEM; > diff --git a/drivers/cpufreq/ia64-acpi-cpufreq.c b/drivers/cpufreq/ia64-acpi-cpufreq.c > index beb191b..c30aaa6 100644 > --- a/drivers/cpufreq/ia64-acpi-cpufreq.c > +++ b/drivers/cpufreq/ia64-acpi-cpufreq.c > @@ -254,7 +254,7 @@ acpi_cpufreq_cpu_init ( > } > > /* alloc freq_table */ > - data->freq_table = kmalloc(sizeof(*data->freq_table) * > + data->freq_table = kzalloc(sizeof(*data->freq_table) * > (data->acpi_data.state_count + 1), > GFP_KERNEL); > if (!data->freq_table) { > diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c > index 5c440f8..d00e5d1 100644 > --- a/drivers/cpufreq/longhaul.c > +++ b/drivers/cpufreq/longhaul.c > @@ -475,7 +475,7 @@ static int longhaul_get_ranges(void) > return -EINVAL; > } > > - longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), > + longhaul_table = kzalloc((numscales + 1) * sizeof(*longhaul_table), > GFP_KERNEL); > if (!longhaul_table) > return -ENOMEM; > diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c > index 770a9e1..1b6ae6b 100644 > --- a/drivers/cpufreq/powernow-k8.c > +++ b/drivers/cpufreq/powernow-k8.c > @@ -623,7 +623,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, > if (check_pst_table(data, pst, maxvid)) > return -EINVAL; > > - powernow_table = kmalloc((sizeof(*powernow_table) > + powernow_table = kzalloc((sizeof(*powernow_table) > * (data->numps + 1)), GFP_KERNEL); > if (!powernow_table) { > printk(KERN_ERR PFX "powernow_table memory alloc failure\n"); > @@ -793,7 +793,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) > } > > /* fill in data->powernow_table */ > - powernow_table = kmalloc((sizeof(*powernow_table) > + powernow_table = kzalloc((sizeof(*powernow_table) > * (data->acpi_data.state_count + 1)), GFP_KERNEL); > if (!powernow_table) { > pr_debug("powernow_table memory alloc failure\n"); > @@ -810,7 +810,6 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) > > powernow_table[data->acpi_data.state_count].frequency = > CPUFREQ_TABLE_END; > - powernow_table[data->acpi_data.state_count].driver_data = 0; > data->powernow_table = powernow_table; > > if (cpumask_first(cpu_core_mask(data->cpu)) == data->cpu) > diff --git a/drivers/cpufreq/s3c24xx-cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c > index a3dc192..be1b2b5 100644 > --- a/drivers/cpufreq/s3c24xx-cpufreq.c > +++ b/drivers/cpufreq/s3c24xx-cpufreq.c > @@ -586,7 +586,7 @@ static int s3c_cpufreq_build_freq(void) > size = cpu_cur.info->calc_freqtable(&cpu_cur, NULL, 0); > size++; > > - ftab = kmalloc(sizeof(*ftab) * size, GFP_KERNEL); > + ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL); > if (!ftab) { > printk(KERN_ERR "%s: no memory for tables\n", __func__); > return -ENOMEM; > @@ -664,7 +664,7 @@ int __init s3c_plltab_register(struct cpufreq_frequency_table *plls, > > size = sizeof(*vals) * (plls_no + 1); > > - vals = kmalloc(size, GFP_KERNEL); > + vals = kzalloc(size, GFP_KERNEL); > if (vals) { > memcpy(vals, plls, size); > pll_reg = vals; > diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c > index 4cfdcff..3867839 100644 > --- a/drivers/cpufreq/spear-cpufreq.c > +++ b/drivers/cpufreq/spear-cpufreq.c > @@ -195,18 +195,15 @@ static int spear_cpufreq_probe(struct platform_device *pdev) > cnt = prop->length / sizeof(u32); > val = prop->value; > > - freq_tbl = kmalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); > + freq_tbl = kzalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); > if (!freq_tbl) { > ret = -ENOMEM; > goto out_put_node; > } > > - for (i = 0; i < cnt; i++) { > - freq_tbl[i].driver_data = i; > + for (i = 0; i < cnt; i++) > freq_tbl[i].frequency = be32_to_cpup(val++); > - } > > - freq_tbl[i].driver_data = i; > freq_tbl[i].frequency = CPUFREQ_TABLE_END; > > spear_cpufreq.freq_tbl = freq_tbl; > -- > 1.7.12.rc2.18.g61b472e > -- To unsubscribe from this list: send the line "unsubscribe cpufreq" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 2014-03-28 at 15:44 +0530, Viresh Kumar wrote: > Few drivers are using kmalloc() to allocate memory for frequency tables and once > we have an additional field '.flags' in 'struct cpufreq_frequency_table', these > might become unstable. Better get these fixed by replacing kmalloc() by > kzalloc() instead. There seems to be some sort of bug fix in the patch at the very end too? Perhaps a better fix would be to use kcalloc for all the allocs with a multiply. > diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c [] > @@ -754,7 +754,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) [] > - data->freq_table = kmalloc(sizeof(*data->freq_table) * > + data->freq_table = kzalloc(sizeof(*data->freq_table) * > (perf->state_count+1), GFP_KERNEL); > diff --git a/drivers/cpufreq/ia64-acpi-cpufreq.c b/drivers/cpufreq/ia64-acpi-cpufreq.c [] > @@ -254,7 +254,7 @@ acpi_cpufreq_cpu_init ( [] > - data->freq_table = kmalloc(sizeof(*data->freq_table) * > + data->freq_table = kzalloc(sizeof(*data->freq_table) * > (data->acpi_data.state_count + 1), > GFP_KERNEL); > diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c [] > @@ -475,7 +475,7 @@ static int longhaul_get_ranges(void) [] > - longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), > diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c [] > @@ -623,7 +623,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, [] > - powernow_table = kmalloc((sizeof(*powernow_table) > + powernow_table = kzalloc((sizeof(*powernow_table) > * (data->numps + 1)), GFP_KERNEL); > diff --git a/drivers/cpufreq/s3c24xx-cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c [] > @@ -586,7 +586,7 @@ static int s3c_cpufreq_build_freq(void) [] > - ftab = kmalloc(sizeof(*ftab) * size, GFP_KERNEL); > + ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL); > diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c [] > @@ -195,18 +195,15 @@ static int spear_cpufreq_probe(struct platform_device *pdev) [] > - freq_tbl = kmalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); > + freq_tbl = kzalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); > if (!freq_tbl) { > ret = -ENOMEM; > goto out_put_node; > } > > - for (i = 0; i < cnt; i++) { > - freq_tbl[i].driver_data = i; > + for (i = 0; i < cnt; i++) > freq_tbl[i].frequency = be32_to_cpup(val++); > - } > > - freq_tbl[i].driver_data = i; > freq_tbl[i].frequency = CPUFREQ_TABLE_END; Is this some bug fix? -- To unsubscribe from this list: send the line "unsubscribe cpufreq" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 28 March 2014 18:59, Joe Perches <joe@perches.com> wrote: > There seems to be some sort of bug fix in the > patch at the very end too? I have mentioned that in the log: Along with that we also remove use of .driver_data from SPEAr driver as it doesn't use it at all. Also, writing zero to .driver_data is not required for powernow-k8 as it is already zero. > Perhaps a better fix would be to use kcalloc for > all the allocs with a multiply. That would make the change very big now as there are lots of drivers which are already using kzalloc() and so wouldn't like to do that in this patch atleast.. -- To unsubscribe from this list: send the line "unsubscribe cpufreq" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index d5eaedb..000e4e0 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -754,7 +754,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) goto err_unreg; } - data->freq_table = kmalloc(sizeof(*data->freq_table) * + data->freq_table = kzalloc(sizeof(*data->freq_table) * (perf->state_count+1), GFP_KERNEL); if (!data->freq_table) { result = -ENOMEM; diff --git a/drivers/cpufreq/ia64-acpi-cpufreq.c b/drivers/cpufreq/ia64-acpi-cpufreq.c index beb191b..c30aaa6 100644 --- a/drivers/cpufreq/ia64-acpi-cpufreq.c +++ b/drivers/cpufreq/ia64-acpi-cpufreq.c @@ -254,7 +254,7 @@ acpi_cpufreq_cpu_init ( } /* alloc freq_table */ - data->freq_table = kmalloc(sizeof(*data->freq_table) * + data->freq_table = kzalloc(sizeof(*data->freq_table) * (data->acpi_data.state_count + 1), GFP_KERNEL); if (!data->freq_table) { diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index 5c440f8..d00e5d1 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c @@ -475,7 +475,7 @@ static int longhaul_get_ranges(void) return -EINVAL; } - longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), + longhaul_table = kzalloc((numscales + 1) * sizeof(*longhaul_table), GFP_KERNEL); if (!longhaul_table) return -ENOMEM; diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c index 770a9e1..1b6ae6b 100644 --- a/drivers/cpufreq/powernow-k8.c +++ b/drivers/cpufreq/powernow-k8.c @@ -623,7 +623,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, if (check_pst_table(data, pst, maxvid)) return -EINVAL; - powernow_table = kmalloc((sizeof(*powernow_table) + powernow_table = kzalloc((sizeof(*powernow_table) * (data->numps + 1)), GFP_KERNEL); if (!powernow_table) { printk(KERN_ERR PFX "powernow_table memory alloc failure\n"); @@ -793,7 +793,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) } /* fill in data->powernow_table */ - powernow_table = kmalloc((sizeof(*powernow_table) + powernow_table = kzalloc((sizeof(*powernow_table) * (data->acpi_data.state_count + 1)), GFP_KERNEL); if (!powernow_table) { pr_debug("powernow_table memory alloc failure\n"); @@ -810,7 +810,6 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; - powernow_table[data->acpi_data.state_count].driver_data = 0; data->powernow_table = powernow_table; if (cpumask_first(cpu_core_mask(data->cpu)) == data->cpu) diff --git a/drivers/cpufreq/s3c24xx-cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c index a3dc192..be1b2b5 100644 --- a/drivers/cpufreq/s3c24xx-cpufreq.c +++ b/drivers/cpufreq/s3c24xx-cpufreq.c @@ -586,7 +586,7 @@ static int s3c_cpufreq_build_freq(void) size = cpu_cur.info->calc_freqtable(&cpu_cur, NULL, 0); size++; - ftab = kmalloc(sizeof(*ftab) * size, GFP_KERNEL); + ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL); if (!ftab) { printk(KERN_ERR "%s: no memory for tables\n", __func__); return -ENOMEM; @@ -664,7 +664,7 @@ int __init s3c_plltab_register(struct cpufreq_frequency_table *plls, size = sizeof(*vals) * (plls_no + 1); - vals = kmalloc(size, GFP_KERNEL); + vals = kzalloc(size, GFP_KERNEL); if (vals) { memcpy(vals, plls, size); pll_reg = vals; diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c index 4cfdcff..3867839 100644 --- a/drivers/cpufreq/spear-cpufreq.c +++ b/drivers/cpufreq/spear-cpufreq.c @@ -195,18 +195,15 @@ static int spear_cpufreq_probe(struct platform_device *pdev) cnt = prop->length / sizeof(u32); val = prop->value; - freq_tbl = kmalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); + freq_tbl = kzalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); if (!freq_tbl) { ret = -ENOMEM; goto out_put_node; } - for (i = 0; i < cnt; i++) { - freq_tbl[i].driver_data = i; + for (i = 0; i < cnt; i++) freq_tbl[i].frequency = be32_to_cpup(val++); - } - freq_tbl[i].driver_data = i; freq_tbl[i].frequency = CPUFREQ_TABLE_END; spear_cpufreq.freq_tbl = freq_tbl;
Few drivers are using kmalloc() to allocate memory for frequency tables and once we have an additional field '.flags' in 'struct cpufreq_frequency_table', these might become unstable. Better get these fixed by replacing kmalloc() by kzalloc() instead. Along with that we also remove use of .driver_data from SPEAr driver as it doesn't use it at all. Also, writing zero to .driver_data is not required for powernow-k8 as it is already zero. Reported-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- @Rafael: Please apply this one before: http://permalink.gmane.org/gmane.linux.kernel/1673994 so that git bisect doesn't break. Though the chances of this field getting initialized to a value equal to BOOST, i.e. 0x1 are very rare. drivers/cpufreq/acpi-cpufreq.c | 2 +- drivers/cpufreq/ia64-acpi-cpufreq.c | 2 +- drivers/cpufreq/longhaul.c | 2 +- drivers/cpufreq/powernow-k8.c | 5 ++--- drivers/cpufreq/s3c24xx-cpufreq.c | 4 ++-- drivers/cpufreq/spear-cpufreq.c | 7 ++----- 6 files changed, 9 insertions(+), 13 deletions(-)