Commit 53cc7721 authored by Thomas Falcon's avatar Thomas Falcon Committed by David S. Miller

ibmvnic: Allocate statistics buffers during probe

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: default avatarThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ecba616e
...@@ -845,8 +845,6 @@ static void release_resources(struct ibmvnic_adapter *adapter) ...@@ -845,8 +845,6 @@ static void release_resources(struct ibmvnic_adapter *adapter)
release_tx_pools(adapter); release_tx_pools(adapter);
release_rx_pools(adapter); release_rx_pools(adapter);
release_stats_token(adapter);
release_stats_buffers(adapter);
release_error_buffers(adapter); release_error_buffers(adapter);
release_napi(adapter); release_napi(adapter);
release_login_rsp_buffer(adapter); release_login_rsp_buffer(adapter);
...@@ -974,14 +972,6 @@ static int init_resources(struct ibmvnic_adapter *adapter) ...@@ -974,14 +972,6 @@ static int init_resources(struct ibmvnic_adapter *adapter)
if (rc) if (rc)
return 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); adapter->vpd = kzalloc(sizeof(*adapter->vpd), GFP_KERNEL);
if (!adapter->vpd) if (!adapter->vpd)
return -ENOMEM; return -ENOMEM;
...@@ -4431,6 +4421,14 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter) ...@@ -4431,6 +4421,14 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
release_crq_queue(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; return rc;
} }
...@@ -4538,6 +4536,9 @@ static int ibmvnic_remove(struct vio_dev *dev) ...@@ -4538,6 +4536,9 @@ static int ibmvnic_remove(struct vio_dev *dev)
release_sub_crqs(adapter, 1); release_sub_crqs(adapter, 1);
release_crq_queue(adapter); release_crq_queue(adapter);
release_stats_token(adapter);
release_stats_buffers(adapter);
adapter->state = VNIC_REMOVED; adapter->state = VNIC_REMOVED;
mutex_unlock(&adapter->reset_lock); mutex_unlock(&adapter->reset_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment