Commit db5dd0db authored by Marcin Wojtas's avatar Marcin Wojtas Committed by David S. Miller

net: mvneta: fix changing MTU when using per-cpu processing

After enabling per-cpu processing it appeared that under heavy load
changing MTU can result in blocking all port's interrupts and
transmitting data is not possible after the change.

This commit fixes above issue by disabling percpu interrupts for the
time, when TXQs and RXQs are reconfigured.
Signed-off-by: default avatarMarcin Wojtas <mw@semihalf.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ce2a04c1
...@@ -3042,6 +3042,20 @@ static int mvneta_check_mtu_valid(struct net_device *dev, int mtu) ...@@ -3042,6 +3042,20 @@ static int mvneta_check_mtu_valid(struct net_device *dev, int mtu)
return mtu; return mtu;
} }
static void mvneta_percpu_enable(void *arg)
{
struct mvneta_port *pp = arg;
enable_percpu_irq(pp->dev->irq, IRQ_TYPE_NONE);
}
static void mvneta_percpu_disable(void *arg)
{
struct mvneta_port *pp = arg;
disable_percpu_irq(pp->dev->irq);
}
/* Change the device mtu */ /* Change the device mtu */
static int mvneta_change_mtu(struct net_device *dev, int mtu) static int mvneta_change_mtu(struct net_device *dev, int mtu)
{ {
...@@ -3066,6 +3080,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu) ...@@ -3066,6 +3080,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu)
* reallocation of the queues * reallocation of the queues
*/ */
mvneta_stop_dev(pp); mvneta_stop_dev(pp);
on_each_cpu(mvneta_percpu_disable, pp, true);
mvneta_cleanup_txqs(pp); mvneta_cleanup_txqs(pp);
mvneta_cleanup_rxqs(pp); mvneta_cleanup_rxqs(pp);
...@@ -3089,6 +3104,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu) ...@@ -3089,6 +3104,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu)
return ret; return ret;
} }
on_each_cpu(mvneta_percpu_enable, pp, true);
mvneta_start_dev(pp); mvneta_start_dev(pp);
mvneta_port_up(pp); mvneta_port_up(pp);
...@@ -3242,20 +3258,6 @@ static void mvneta_mdio_remove(struct mvneta_port *pp) ...@@ -3242,20 +3258,6 @@ static void mvneta_mdio_remove(struct mvneta_port *pp)
pp->phy_dev = NULL; pp->phy_dev = NULL;
} }
static void mvneta_percpu_enable(void *arg)
{
struct mvneta_port *pp = arg;
enable_percpu_irq(pp->dev->irq, IRQ_TYPE_NONE);
}
static void mvneta_percpu_disable(void *arg)
{
struct mvneta_port *pp = arg;
disable_percpu_irq(pp->dev->irq);
}
/* Electing a CPU must be done in an atomic way: it should be done /* Electing a CPU must be done in an atomic way: it should be done
* after or before the removal/insertion of a CPU and this function is * after or before the removal/insertion of a CPU and this function is
* not reentrant. * not reentrant.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment