Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bbb47bde authored by Viresh Kumar's avatar Viresh Kumar Committed by Tejun Heo
Browse files

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 0668106c
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -439,7 +439,7 @@ void phy_start_machine(struct phy_device *phydev,
{
	phydev->adjust_state = handler;

	schedule_delayed_work(&phydev->state_queue, HZ);
	queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, HZ);
}

/**
@@ -500,7 +500,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
	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;
}
@@ -655,7 +655,7 @@ static void phy_change(struct work_struct *work)

	/* 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;

@@ -918,7 +918,8 @@ void phy_state_machine(struct work_struct *work)
	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,