| From bbe9f36ad93d3404e4c99509f6d13aed67fce02e Mon Sep 17 00:00:00 2001 |
| From: Viresh Kumar <viresh.kumar@linaro.org> |
| Date: Wed, 24 Apr 2013 17:12:55 +0530 |
| Subject: PHYLIB: queue work on system_power_efficient_wq |
| |
| Phylib uses workqueues for multiple purposes. There is no real dependency of |
| scheduling these on the cpu which scheduled them. |
| |
| On a idle system, it is observed that and idle cpu wakes up many times just to |
| service this work. It would be better if we can schedule it on a cpu which the |
| scheduler believes to be the most appropriate one. |
| |
| This patch replaces system_wq with system_power_efficient_wq for PHYLIB. |
| |
| Cc: David S. Miller <davem@davemloft.net> |
| Cc: netdev@vger.kernel.org |
| Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Acked-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| (cherry picked from commit bbb47bdeae756f04b896b55b51f230f3eb21f207) |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| --- |
| drivers/net/phy/phy.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/phy/phy.c |
| +++ b/drivers/net/phy/phy.c |
| @@ -458,7 +458,7 @@ void phy_start_machine(struct phy_device |
| { |
| phydev->adjust_state = handler; |
| |
| - schedule_delayed_work(&phydev->state_queue, HZ); |
| + queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, HZ); |
| } |
| |
| /** |
| @@ -519,7 +519,7 @@ static irqreturn_t phy_interrupt(int irq |
| disable_irq_nosync(irq); |
| atomic_inc(&phydev->irq_disable); |
| |
| - schedule_work(&phydev->phy_queue); |
| + queue_work(system_power_efficient_wq, &phydev->phy_queue); |
| |
| return IRQ_HANDLED; |
| } |
| @@ -674,7 +674,7 @@ static void phy_change(struct work_struc |
| |
| /* reschedule state queue work to run as soon as possible */ |
| cancel_delayed_work_sync(&phydev->state_queue); |
| - schedule_delayed_work(&phydev->state_queue, 0); |
| + queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, 0); |
| |
| return; |
| |
| @@ -937,7 +937,8 @@ void phy_state_machine(struct work_struc |
| if (err < 0) |
| phy_error(phydev); |
| |
| - schedule_delayed_work(&phydev->state_queue, PHY_STATE_TIME * HZ); |
| + queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, |
| + PHY_STATE_TIME * HZ); |
| } |
| |
| static inline void mmd_phy_indirect(struct mii_bus *bus, int prtad, int devad, |