On 01/18/2018 04:27 PM, John Allen wrote: > In reset events in which our memory allocations need to be reallocated, > VPD data is being freed, but never reallocated. This can cause issues if > we later attempt to access that memory or reset and attempt to free the > memory. This patch moves the allocation of the VPD data to init_resources > so that it will be symmetrically freed during release resources. > > Signed-off-by: John Allen <jal...@linux.vnet.ibm.com>
Reviewed-by: Nathan Fontenot <nf...@linux.vnet.ibm.com> > --- > diff --git a/drivers/net/ethernet/ibm/ibmvnic.c > b/drivers/net/ethernet/ibm/ibmvnic.c > index bb56460..f0dbb76 100644 > --- a/drivers/net/ethernet/ibm/ibmvnic.c > +++ b/drivers/net/ethernet/ibm/ibmvnic.c > @@ -867,7 +867,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter > *adapter) > if (adapter->vpd->buff) > len = adapter->vpd->len; > > - reinit_completion(&adapter->fw_done); > + init_completion(&adapter->fw_done); > crq.get_vpd_size.first = IBMVNIC_CRQ_CMD; > crq.get_vpd_size.cmd = GET_VPD_SIZE; > ibmvnic_send_crq(adapter, &crq); > @@ -929,6 +929,13 @@ static int init_resources(struct ibmvnic_adapter > *adapter) > if (!adapter->vpd) > return -ENOMEM; > > + /* Vital Product Data (VPD) */ > + rc = ibmvnic_get_vpd(adapter); > + if (rc) { > + netdev_err(netdev, "failed to initialize Vital Product Data > (VPD)\n"); > + return rc; > + } > + > adapter->map_id = 1; > adapter->napi = kcalloc(adapter->req_rx_queues, > sizeof(struct napi_struct), GFP_KERNEL); > @@ -1002,7 +1009,7 @@ static int __ibmvnic_open(struct net_device *netdev) > static int ibmvnic_open(struct net_device *netdev) > { > struct ibmvnic_adapter *adapter = netdev_priv(netdev); > - int rc, vpd; > + int rc; > > mutex_lock(&adapter->reset_lock); > > @@ -1030,11 +1037,6 @@ static int ibmvnic_open(struct net_device *netdev) > rc = __ibmvnic_open(netdev); > netif_carrier_on(netdev); > > - /* Vital Product Data (VPD) */ > - vpd = ibmvnic_get_vpd(adapter); > - if (vpd) > - netdev_err(netdev, "failed to initialize Vital Product Data > (VPD)\n"); > - > mutex_unlock(&adapter->reset_lock); > > return rc; >