*********************************************************************/
static DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE;
+ static DEFINE_PER_CPU(unsigned long, max_freq_cpu);
static DEFINE_PER_CPU(unsigned long, max_freq_scale) = SCHED_CAPACITY_SCALE;
+ static DEFINE_PER_CPU(unsigned long, min_freq_scale);
static void
- scale_freq_capacity(struct cpufreq_policy *policy, struct cpufreq_freqs *freqs)
+ scale_freq_capacity(const cpumask_t *cpus, unsigned long cur_freq,
+ unsigned long max_freq)
{
- if (!policy->max || !policy->cpuinfo.max_freq)
++ if (!max_freq)
+ return;
- unsigned long cur = freqs ? freqs->new : policy->cur;
- unsigned long scale = (cur << SCHED_CAPACITY_SHIFT) / policy->max;
- struct cpufreq_cpuinfo *cpuinfo = &policy->cpuinfo;
+ unsigned long scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq;
int cpu;
- pr_debug("cpus %*pbl cur/cur max freq %lu/%u kHz freq scale %lu\n",
- cpumask_pr_args(policy->cpus), cur, policy->max, scale);
-
- for_each_cpu(cpu, policy->cpus)
+ for_each_cpu(cpu, cpus) {
per_cpu(freq_scale, cpu) = scale;
+ per_cpu(max_freq_cpu, cpu) = max_freq;
+ }
+
+ pr_debug("cpus %*pbl cur freq/max freq %lu/%lu kHz freq scale %lu\n",
+ cpumask_pr_args(cpus), cur_freq, max_freq, scale);
+ }
- if (freqs)
+ unsigned long cpufreq_scale_freq_capacity(struct sched_domain *sd, int cpu)
+ {
+ return per_cpu(freq_scale, cpu);
+ }
+
+ static void
+ scale_max_freq_capacity(const cpumask_t *cpus, unsigned long policy_max_freq)
+ {
+ unsigned long scale, max_freq;
+ int cpu = cpumask_first(cpus);
+
+ if (cpu >= nr_cpu_ids)
return;
- scale = (policy->max << SCHED_CAPACITY_SHIFT) / cpuinfo->max_freq;
+ max_freq = per_cpu(max_freq_cpu, cpu);
- pr_debug("cpus %*pbl cur max/max freq %u/%u kHz max freq scale %lu\n",
- cpumask_pr_args(policy->cpus), policy->max, cpuinfo->max_freq,
- scale);
+ if (!max_freq)
+ return;
- for_each_cpu(cpu, policy->cpus)
+ scale = (policy_max_freq << SCHED_CAPACITY_SHIFT) / max_freq;
+
+ for_each_cpu(cpu, cpus)
per_cpu(max_freq_scale, cpu) = scale;
+
+ pr_debug("cpus %*pbl policy max freq/max freq %lu/%lu kHz max freq scale %lu\n",
+ cpumask_pr_args(cpus), policy_max_freq, max_freq, scale);
}
- unsigned long cpufreq_scale_freq_capacity(struct sched_domain *sd, int cpu)
+ unsigned long cpufreq_scale_max_freq_capacity(struct sched_domain *sd, int cpu)
{
- return per_cpu(freq_scale, cpu);
+ return per_cpu(max_freq_scale, cpu);
}
- unsigned long cpufreq_scale_max_freq_capacity(int cpu)
+ static void
+ scale_min_freq_capacity(const cpumask_t *cpus, unsigned long policy_min_freq)
{
- return per_cpu(max_freq_scale, cpu);
+ unsigned long scale, max_freq;
+ int cpu = cpumask_first(cpus);
+
+ if (cpu >= nr_cpu_ids)
+ return;
+
+ max_freq = per_cpu(max_freq_cpu, cpu);
+
+ if (!max_freq)
+ return;
+
+ scale = (policy_min_freq << SCHED_CAPACITY_SHIFT) / max_freq;
+
+ for_each_cpu(cpu, cpus)
+ per_cpu(min_freq_scale, cpu) = scale;
+
+ pr_debug("cpus %*pbl policy min freq/max freq %lu/%lu kHz min freq scale %lu\n",
+ cpumask_pr_args(cpus), policy_min_freq, max_freq, scale);
+ }
+
+ unsigned long cpufreq_scale_min_freq_capacity(struct sched_domain *sd, int cpu)
+ {
+ return per_cpu(min_freq_scale, cpu);
}
static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
BUG_ON(pa->pa_type != MB_INODE_PA);
group = ext4_get_group_number(sb, pa->pa_pstart);
- err = ext4_mb_load_buddy(sb, group, &e4b);
+ err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
+ GFP_NOFS|__GFP_NOFAIL);
if (err) {
- ext4_warning(sb, "Error loading buddy information for %u",
- group);
- ext4_error(sb, "Error %d loading buddy information for %u",
++ ext4_warning(sb, "Error %d loading buddy information for %u",
+ err, group);
continue;
}
spin_unlock(&lg->lg_prealloc_lock);
list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
+ int err;
group = ext4_get_group_number(sb, pa->pa_pstart);
- if (ext4_mb_load_buddy(sb, group, &e4b)) {
- ext4_warning(sb, "Error loading buddy information for %u",
- group);
+ err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
+ GFP_NOFS|__GFP_NOFAIL);
+ if (err) {
- ext4_error(sb, "Error %d loading buddy information for %u",
++ ext4_warning(sb, "Error %d loading buddy information for %u",
+ err, group);
continue;
}
ext4_lock_group(sb, group);