• Andreas Herrmann's avatar
    net: calxedaxgmac: Fix panic caused by MTU change of active interface · b5ad795e
    Andreas Herrmann authored
    Changing MTU size of an xgmac network interface while it is active can
    cause a panic like
    
      skbuff: skb_over_panic: text:c03bc62c len:1090 put:1090 head:edfb6900 data:edfb6942 tail:0xedfb6d84 end:0xedfb6bc0 dev:eth0
      ------------[ cut here ]------------
      kernel BUG at net/core/skbuff.c:126!
      Internal error: Oops - BUG: 0 [#1] SMP ARM
      Modules linked in:
      CPU: 0 PID: 762 Comm: python Tainted: G        W    3.10.0-00015-g3e33cd7 #309
      task: edcfe000 ti: ed67e000 task.ti: ed67e000
      PC is at skb_panic+0x64/0x70
      LR is at wake_up_klogd+0x5c/0x68
    
    This happens because xgmac_change_mtu modifies dev->mtu before the
    network interface is quiesced. And thus there still might be buffers
    in use which have a buffer size based on the old MTU.
    
    To fix this I moved the change of dev->mtu after the call to
    xgmac_stop.
    
    Another modification is required (in xgmac_stop) to ensure that
    xgmac_xmit is really not called anymore (xgmac_tx_complete might wake
    up the queue again).
    
    I've tested the fix by switching MTU size every second between 600 and
    1500 while network traffic was going on. The test box survived a test
    of several hours (until I've stopped it) whereas w/o this fix above
    panic occurs after several minutes (at most).
    
    Change since v1:
    - remove call to netif_stop_queue at beginning of xgmac_stop
    - use netif_tx_disable instead of locking+netif_stop_queue
    Signed-off-by: default avatarAndreas Herrmann <andreas.herrmann@calxeda.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b5ad795e
xgmac.c 56.3 KB