cpufreq: governor: Avoid irq_work_queue_on() crash on non-SMP ARM
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 15 Feb 2016 21:15:34 +0000 (22:15 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 9 Mar 2016 13:41:02 +0000 (14:41 +0100)
As it turns out, irq_work_queue_on() will crash if invoked on
non-SMP ARM platforms, but in fact it is not necessary to use that
function in the cpufreq governor code (as it doesn't matter to that
code which CPU will handle the irq_work), so change it to always use
irq_work_queue().

Fixes: 8fb47ff100af (cpufreq: governor: Replace timers with utilization update callbacks)
Reported-and-tested-by: Guenter Roeck <linux@roeck-us.net>
Reported-and-tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/cpufreq_governor.c

index d41db19a9bb7743d496d72e0fb3d52f44a62cc7e..580b692d6df4cce8308ca5c9608d5e31b0e12672 100644 (file)
@@ -350,15 +350,6 @@ static void dbs_irq_work(struct irq_work *irq_work)
        schedule_work(&policy_dbs->work);
 }
 
-static inline void gov_queue_irq_work(struct policy_dbs_info *policy_dbs)
-{
-#ifdef CONFIG_SMP
-       irq_work_queue_on(&policy_dbs->irq_work, smp_processor_id());
-#else
-       irq_work_queue(&policy_dbs->irq_work);
-#endif
-}
-
 static void dbs_update_util_handler(struct update_util_data *data, u64 time,
                                    unsigned long util, unsigned long max)
 {
@@ -378,7 +369,7 @@ static void dbs_update_util_handler(struct update_util_data *data, u64 time,
                delta_ns = time - policy_dbs->last_sample_time;
                if ((s64)delta_ns >= policy_dbs->sample_delay_ns) {
                        policy_dbs->last_sample_time = time;
-                       gov_queue_irq_work(policy_dbs);
+                       irq_work_queue(&policy_dbs->irq_work);
                        return;
                }
        }