mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
net: ena: fix race between link up and device initalization
[ Upstream commite1f1bd9bfb] Fix race condition between ena_update_on_link_change() and ena_restore_device(). This race can occur if link notification arrives while the driver is performing a reset sequence. In this case link can be set up, enabling the device, before it is fully restored. If packets are sent at this time, the driver might access uninitialized data structures, causing kernel crash. Move the clearing of ENA_FLAG_ONGOING_RESET and netif_carrier_on() after ena_up() to ensure the device is ready when link is set up. Fixes:d18e4f6834("net: ena: fix race condition between device reset and link up setup") Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
fd49ffa383
commit
198198d5ae
@@ -2595,11 +2595,6 @@ static int ena_restore_device(struct ena_adapter *adapter)
|
||||
goto err_device_destroy;
|
||||
}
|
||||
|
||||
clear_bit(ENA_FLAG_ONGOING_RESET, &adapter->flags);
|
||||
/* Make sure we don't have a race with AENQ Links state handler */
|
||||
if (test_bit(ENA_FLAG_LINK_UP, &adapter->flags))
|
||||
netif_carrier_on(adapter->netdev);
|
||||
|
||||
rc = ena_enable_msix_and_set_admin_interrupts(adapter,
|
||||
adapter->num_queues);
|
||||
if (rc) {
|
||||
@@ -2616,6 +2611,11 @@ static int ena_restore_device(struct ena_adapter *adapter)
|
||||
}
|
||||
|
||||
set_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags);
|
||||
|
||||
clear_bit(ENA_FLAG_ONGOING_RESET, &adapter->flags);
|
||||
if (test_bit(ENA_FLAG_LINK_UP, &adapter->flags))
|
||||
netif_carrier_on(adapter->netdev);
|
||||
|
||||
mod_timer(&adapter->timer_service, round_jiffies(jiffies + HZ));
|
||||
dev_err(&pdev->dev, "Device reset completed successfully\n");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user