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;
> 

Reply via email to