After changing an interface's MTU, then bringing the interface down and
back up again, I immediately saw tons of kernel messages like below.
The reason for this bad behavior is mvneta_rxq_drop_pkts(), which calls
dma_unmap_single() on already-freed memory. So we need to switch the
order of those two operations.
[ 152.388518] BUG: Bad page state in process ifconfig pfn:1b518
[ 152.388526] page:
dff3dbc0 count:0 mapcount:0 mapping: (null) index:0x0
[ 152.395178] flags: 0x200(arch_1)
[ 152.398441] page dumped because: PAGE_FLAGS_CHECK_AT_PREP flag set
[ 152.398446] bad because of flags:
[ 152.398450] flags: 0x200(arch_1)
[ 152.401716] Modules linked in:
[ 152.401728] CPU: 0 PID: 1453 Comm: ifconfig Tainted: P B O 4.1.12.armada.1 #1
[ 152.401733] Hardware name: Marvell Armada 370/XP (Device Tree)
[ 152.401749] [<
c0015b1c>] (unwind_backtrace) from [<
c0011d8c>] (show_stack+0x10/0x14)
[ 152.401762] [<
c0011d8c>] (show_stack) from [<
c06aa68c>] (dump_stack+0x74/0x90)
[ 152.401772] [<
c06aa68c>] (dump_stack) from [<
c0096c08>] (bad_page+0xc4/0x124)
[ 152.401783] [<
c0096c08>] (bad_page) from [<
c0099378>] (get_page_from_freelist+0x4e4/0x644)
[ 152.401794] [<
c0099378>] (get_page_from_freelist) from [<
c0099620>] (__alloc_pages_nodemask+0x148/0x784)
[ 152.401805] [<
c0099620>] (__alloc_pages_nodemask) from [<
c00ac658>] (kmalloc_order+0x10/0x20)
[ 152.401818] [<
c00ac658>] (kmalloc_order) from [<
c04c6f44>] (mvneta_rx_refill+0xc4/0xe8)
[ 152.401830] [<
c04c6f44>] (mvneta_rx_refill) from [<
c04c96c0>] (mvneta_setup_rxqs+0x298/0x39c)
[ 152.401842] [<
c04c96c0>] (mvneta_setup_rxqs) from [<
c04c9904>] (mvneta_open+0x3c/0x150)
[ 152.401853] [<
c04c9904>] (mvneta_open) from [<
c0597764>] (__dev_open+0xac/0x124)
[ 152.401864] [<
c0597764>] (__dev_open) from [<
c05979e4>] (__dev_change_flags+0x8c/0x148)
[ 152.401875] [<
c05979e4>] (__dev_change_flags) from [<
c0597ac0>] (dev_change_flags+0x18/0x48)
[ 152.401886] [<
c0597ac0>] (dev_change_flags) from [<
c060d308>] (devinet_ioctl+0x620/0x6d0)
[ 152.401897] [<
c060d308>] (devinet_ioctl) from [<
c057d810>] (sock_ioctl+0x64/0x288)
[ 152.401908] [<
c057d810>] (sock_ioctl) from [<
c00dcb7c>] (do_vfs_ioctl+0x78/0x608)
[ 152.401918] [<
c00dcb7c>] (do_vfs_ioctl) from [<
c00dd170>] (SyS_ioctl+0x64/0x74)
[ 152.401930] [<
c00dd170>] (SyS_ioctl) from [<
c000f3a0>] (ret_fast_syscall+0x0/0x3c)
Signed-off-by: Justin Maggard <jmaggard@netgear.com>
Signed-off-by: David S. Miller <davem@davemloft.net>