On 01/15/2018 03:11 PM, John Allen wrote: > Using newer backing devices can cause the required padding at the end of > rx buffers to change. Currently we assume that the size of buffers will > never change, but in the case that we failover from a backing device with > smaller padding requirement to a backing device with a larger padding > requirement, the vnic server will fail to post rx buffers due to > inadequate space in our rx pool. This patch fixes the issue by checking > whether or not the buffer size has changed on a reset and if it has, > reallocate the buffer. > > Signed-off-by: John Allen <jal...@linux.vnet.ibm.com> > --- > diff --git a/drivers/net/ethernet/ibm/ibmvnic.c > b/drivers/net/ethernet/ibm/ibmvnic.c > index b676fa9..5b68a28 100644 > --- a/drivers/net/ethernet/ibm/ibmvnic.c > +++ b/drivers/net/ethernet/ibm/ibmvnic.c > @@ -412,13 +412,25 @@ static int reset_rx_pools(struct ibmvnic_adapter > *adapter) > int rx_scrqs; > int i, j, rc; > > + size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + > + be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size)); > + > rx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); > for (i = 0; i < rx_scrqs; i++) { > rx_pool = &adapter->rx_pool[i]; > > netdev_dbg(adapter->netdev, "Re-setting rx_pool[%d]\n", i); > > - rc = reset_long_term_buff(adapter, &rx_pool->long_term_buff); > + if (rx_pool->buff_size != be64_to_cpu(size_array[i])) { > + rx_pool->buff_size = be64_to_cpu(size_array[i]); > + rc = alloc_long_term_buff(adapter, > + &rx_pool->long_term_buff, > + rx_pool->size * > + rx_pool->buff_size);
We should be freeing the long_term_buff here before allocating a new one. I will send a new version with the changes. Please ignore this version. -John > + } else { > + rc = reset_long_term_buff(adapter, > + &rx_pool->long_term_buff); > + } > if (rc) > return rc; >