• Guilherme G. Piccoli's avatar
    net: ena: Add PCI shutdown handler to allow safe kexec · 428c4913
    Guilherme G. Piccoli authored
    Currently ENA only provides the PCI remove() handler, used during rmmod
    for example. This is not called on shutdown/kexec path; we are potentially
    creating a failure scenario on kexec:
    
    (a) Kexec is triggered, no shutdown() / remove() handler is called for ENA;
    instead pci_device_shutdown() clears the master bit of the PCI device,
    stopping all DMA transactions;
    
    (b) Kexec reboot happens and the device gets enabled again, likely having
    its FW with that DMA transaction buffered; then it may trigger the (now
    invalid) memory operation in the new kernel, corrupting kernel memory area.
    
    This patch aims to prevent this, by implementing a shutdown() handler
    quite similar to the remove() one - the difference being the handling
    of the netdev, which is unregistered on remove(), but following the
    convention observed in other drivers, it's only detached on shutdown().
    
    This prevents an odd issue in AWS Nitro instances, in which after the 2nd
    kexec the next one will fail with an initrd corruption, caused by a wild
    DMA write to invalid kernel memory. The lspci output for the adapter
    present in my instance is:
    
    00:05.0 Ethernet controller [0200]: Amazon.com, Inc. Elastic Network
    Adapter (ENA) [1d0f:ec20]
    Suggested-by: default avatarGavin Shan <gshan@redhat.com>
    Signed-off-by: default avatarGuilherme G. Piccoli <gpiccoli@canonical.com>
    Acked-by: default avatarSameeh Jubran <sameehj@amazon.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    428c4913
ena_netdev.c 122 KB