]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
ibmvnic: Allocate statistics buffers during probe
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Tue, 27 Feb 2018 00:10:56 +0000 (18:10 -0600)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Mon, 27 Aug 2018 14:40:05 +0000 (16:40 +0200)
BugLink: http://bugs.launchpad.net/bugs/1786352
[ Upstream commit 53cc7721fdf12e649994cfb7d8f562acb0e4510b ]

Currently, buffers holding individual queue statistics are allocated
when the device is opened. If an ibmvnic interface is hotplugged or
initialized but never opened, an attempt to get statistics with
ethtool will result in a kernel panic.

Since the driver allocates a constant number, the maximum supported
queues, of buffers, these can be allocated during device probe and
freed when the device is hot-unplugged or the module is removed.

Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/net/ethernet/ibm/ibmvnic.c

index eb561f684b06c2d8369acaa96c1beafe5f398ca4..fd8e6937ee00485e1ca474f74e7ff6a85876dfc6 100644 (file)
@@ -812,8 +812,6 @@ static void release_resources(struct ibmvnic_adapter *adapter)
        release_tx_pools(adapter);
        release_rx_pools(adapter);
 
-       release_stats_token(adapter);
-       release_stats_buffers(adapter);
        release_error_buffers(adapter);
 
        if (adapter->napi) {
@@ -953,14 +951,6 @@ static int init_resources(struct ibmvnic_adapter *adapter)
        if (rc)
                return rc;
 
-       rc = init_stats_buffers(adapter);
-       if (rc)
-               return rc;
-
-       rc = init_stats_token(adapter);
-       if (rc)
-               return rc;
-
        adapter->vpd = kzalloc(sizeof(*adapter->vpd), GFP_KERNEL);
        if (!adapter->vpd)
                return -ENOMEM;
@@ -4390,6 +4380,14 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
                release_crq_queue(adapter);
        }
 
+       rc = init_stats_buffers(adapter);
+       if (rc)
+               return rc;
+
+       rc = init_stats_token(adapter);
+       if (rc)
+               return rc;
+
        return rc;
 }
 
@@ -4497,6 +4495,9 @@ static int ibmvnic_remove(struct vio_dev *dev)
        release_sub_crqs(adapter);
        release_crq_queue(adapter);
 
+       release_stats_token(adapter);
+       release_stats_buffers(adapter);
+
        adapter->state = VNIC_REMOVED;
 
        mutex_unlock(&adapter->reset_lock);