WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-users

[Xen-users] Re: 3.0.0-rc2: Xen: powernow-k8: Kernel panic - not syncing:

Konrad Rzeszutek Wilk wrote:
> On Tue, Jun 14, 2011 at 03:46:34PM +0200, Tobias Diedrich wrote:
> > [    5.740826] powernow-k8: fid 0x2 (1000 MHz), vid 0x12
> > [    5.740941] powernow-k8: fid 0xa (1800 MHz), vid 0xa
> > [    5.741057] powernow-k8: fid 0xc (2000 MHz), vid 0x8
> > [    5.741170] powernow-k8: fid 0xe (2200 MHz), vid 0x8
> > [    5.741304] cpufreq_stats_create_table: policy->cur is 800000
> > [    5.741475] last_index set to -1 in cpufreq_stats_create_table!
> > 
> > I think policy->cur used here probably set in powernowk8_cpu_init.
> 
> Yup, and there is not much that can be done there. Lets try this patch

Thanks, this works fine for suppressing the crash.

> diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c 
> b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
> index 2368e38..7e4a664 100644
> --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
> +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
> @@ -1079,8 +1079,10 @@ static int transition_frequency_fidvid(struct 
> powernow_k8_data *data,
>       }
>  
>       res = transition_fid_vid(data, fid, vid);
> -     freqs.new = find_khz_freq_from_fid(data->currfid);
> +     if (res)
> +             return res;
>  
> +     freqs.new = find_khz_freq_from_fid(data->currfid);
>       for_each_cpu(i, data->available_cores) {
>               freqs.cpu = i;
>               cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> @@ -1112,6 +1114,9 @@ static int transition_frequency_pstate(struct 
> powernow_k8_data *data,
>       }
>  
>       res = transition_pstate(data, pstate);
> +     if (res)
> +             return res;
> +
>       freqs.new = find_khz_freq_from_pstate(data->powernow_table, pstate);
>  
>       for_each_cpu(i, data->available_cores) {
> diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
> index 4f1b8de..0ecb1e2 100644
> --- a/drivers/cpufreq/cpufreq_stats.c
> +++ b/drivers/cpufreq/cpufreq_stats.c
> @@ -298,11 +298,13 @@ static int cpufreq_stat_notifier_trans(struct 
> notifier_block *nb,
>       old_index = stat->last_index;
>       new_index = freq_table_get_index(stat, freq->new);
>  
> -     cpufreq_stats_update(freq->cpu);
> -     if (old_index == new_index)
> +     /* We can't do stat->time_in_state[-1]= .. */
> +     if (old_index == -1 || new_index == -1)
>               return 0;
>  
> -     if (old_index == -1 || new_index == -1)
> +     cpufreq_stats_update(freq->cpu);
> +
> +     if (old_index == new_index)
>               return 0;
>  
>       spin_lock(&cpufreq_stats_lock);

-- 
Tobias                                          PGP: http://8ef7ddba.uguu.de

_______________________________________________
Xen-users mailing list
Xen-users@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-users