123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- From: Marcin Wojtas <mw@semihalf.com>
- Date: Fri, 1 Apr 2016 15:21:18 +0200
- Subject: [PATCH] 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: Marcin Wojtas <mw@semihalf.com>
- Signed-off-by: David S. Miller <davem@davemloft.net>
- ---
- --- a/drivers/net/ethernet/marvell/mvneta.c
- +++ b/drivers/net/ethernet/marvell/mvneta.c
- @@ -3045,6 +3045,20 @@ static int mvneta_check_mtu_valid(struct
- 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 */
- static int mvneta_change_mtu(struct net_device *dev, int mtu)
- {
- @@ -3069,6 +3083,7 @@ static int mvneta_change_mtu(struct net_
- * reallocation of the queues
- */
- mvneta_stop_dev(pp);
- + on_each_cpu(mvneta_percpu_disable, pp, true);
-
- mvneta_cleanup_txqs(pp);
- mvneta_cleanup_rxqs(pp);
- @@ -3092,6 +3107,7 @@ static int mvneta_change_mtu(struct net_
- return ret;
- }
-
- + on_each_cpu(mvneta_percpu_enable, pp, true);
- mvneta_start_dev(pp);
-
- netdev_update_features(dev);
- @@ -3244,20 +3260,6 @@ static void mvneta_mdio_remove(struct mv
- 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
- * after or before the removal/insertion of a CPU and this function is
- * not reentrant.
|