lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 110/293] i40evf: assign num_active_queues inside i40evf_alloc_queues
    Date
    From: Jacob Keller <jacob.e.keller@intel.com>

    [ Upstream commit 65c7006f234c9ede887d468f595f259a5c5cc552 ]

    The variable num_active_queues represents the number of active queues we
    have for the device. We assign this pretty early in i40evf_init_subtask.

    Several code locations are written with loops over the tx_rings and
    rx_rings structures, which don't get allocated until
    i40evf_alloc_queues, and which get freed by i40evf_free_queues.

    These call sites were written under the assumption that tx_rings and
    rx_rings would always be allocated at least when num_active_queues is
    non-zero.

    Lets fix this by moving the assignment into the function where we
    allocate queues. We'll use a temporary variable for storage so that we
    don't assign the value in the adapter structure until after the rings
    have been set up.

    Finally, when we free the queues, we'll clear the value to ensure that
    we do not loop over the rings memory that no longer exists.

    This resolves a possible NULL pointer dereference in
    i40evf_get_ethtool_stats which could occur if the VF fails to recover
    from a reset, and then a user requests statistics.

    Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
    Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/net/ethernet/intel/i40evf/i40evf_main.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
    index 14372810fc27..34fc948bf550 100644
    --- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
    +++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
    @@ -1123,6 +1123,7 @@ static void i40evf_free_queues(struct i40evf_adapter *adapter)
    {
    if (!adapter->vsi_res)
    return;
    + adapter->num_active_queues = 0;
    kfree(adapter->tx_rings);
    adapter->tx_rings = NULL;
    kfree(adapter->rx_rings);
    @@ -1139,18 +1140,22 @@ static void i40evf_free_queues(struct i40evf_adapter *adapter)
    **/
    static int i40evf_alloc_queues(struct i40evf_adapter *adapter)
    {
    - int i;
    + int i, num_active_queues;
    +
    + num_active_queues = min_t(int,
    + adapter->vsi_res->num_queue_pairs,
    + (int)(num_online_cpus()));

    - adapter->tx_rings = kcalloc(adapter->num_active_queues,
    + adapter->tx_rings = kcalloc(num_active_queues,
    sizeof(struct i40e_ring), GFP_KERNEL);
    if (!adapter->tx_rings)
    goto err_out;
    - adapter->rx_rings = kcalloc(adapter->num_active_queues,
    + adapter->rx_rings = kcalloc(num_active_queues,
    sizeof(struct i40e_ring), GFP_KERNEL);
    if (!adapter->rx_rings)
    goto err_out;

    - for (i = 0; i < adapter->num_active_queues; i++) {
    + for (i = 0; i < num_active_queues; i++) {
    struct i40e_ring *tx_ring;
    struct i40e_ring *rx_ring;

    @@ -1172,6 +1177,8 @@ static int i40evf_alloc_queues(struct i40evf_adapter *adapter)
    rx_ring->rx_itr_setting = (I40E_ITR_DYNAMIC | I40E_ITR_RX_DEF);
    }

    + adapter->num_active_queues = num_active_queues;
    +
    return 0;

    err_out:
    @@ -2440,9 +2447,6 @@ static void i40evf_init_task(struct work_struct *work)
    adapter->watchdog_timer.data = (unsigned long)adapter;
    mod_timer(&adapter->watchdog_timer, jiffies + 1);

    - adapter->num_active_queues = min_t(int,
    - adapter->vsi_res->num_queue_pairs,
    - (int)(num_online_cpus()));
    adapter->tx_desc_count = I40EVF_DEFAULT_TXD;
    adapter->rx_desc_count = I40EVF_DEFAULT_RXD;
    err = i40evf_init_interrupt_scheme(adapter);
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 04:22    [W:5.504 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site