ibmveth: Automatically enable larger rx buffer pools for larger mtu

Activates larger rx buffer pools when the MTU is changed to a larger
value. This patch de-activates the large rx buffer pools when the MTU
changes to a smaller value.

Signed-off-by: Santiago Leon <santil@us.ibm.com>
Signed-off-by: Robert Jennings <rcj@linux.vnet.ibm.com>
Acked-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Santiago Leon and committed by
Benjamin Herrenschmidt
ea866e65 22e1a4dd

+14 -8
+14 -8
drivers/net/ibmveth.c
··· 1054 { 1055 struct ibmveth_adapter *adapter = dev->priv; 1056 int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; 1057 - int reinit = 0; 1058 int i, rc; 1059 1060 if (new_mtu < IBMVETH_MAX_MTU) ··· 1066 if (i == IbmVethNumBufferPools) 1067 return -EINVAL; 1068 1069 - /* Look for an active buffer pool that can hold the new MTU */ 1070 - for(i = 0; i<IbmVethNumBufferPools; i++) { 1071 - if (!adapter->rx_buff_pool[i].active) { 1072 - adapter->rx_buff_pool[i].active = 1; 1073 - reinit = 1; 1074 } 1075 1076 if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { 1077 - if (reinit && netif_running(adapter->netdev)) { 1078 adapter->pool_config = 1; 1079 ibmveth_close(adapter->netdev); 1080 adapter->pool_config = 0; ··· 1407 return -EPERM; 1408 } 1409 1410 - pool->active = 0; 1411 if (netif_running(netdev)) { 1412 adapter->pool_config = 1; 1413 ibmveth_close(netdev); 1414 adapter->pool_config = 0; 1415 if ((rc = ibmveth_open(netdev))) 1416 return rc; 1417 } 1418 } 1419 } else if (attr == &veth_num_attr) { 1420 if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT)
··· 1054 { 1055 struct ibmveth_adapter *adapter = dev->priv; 1056 int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; 1057 int i, rc; 1058 1059 if (new_mtu < IBMVETH_MAX_MTU) ··· 1067 if (i == IbmVethNumBufferPools) 1068 return -EINVAL; 1069 1070 + /* Deactivate all the buffer pools so that the next loop can activate 1071 + only the buffer pools necessary to hold the new MTU */ 1072 + for (i = 0; i < IbmVethNumBufferPools; i++) 1073 + if (adapter->rx_buff_pool[i].active) { 1074 + ibmveth_free_buffer_pool(adapter, 1075 + &adapter->rx_buff_pool[i]); 1076 + adapter->rx_buff_pool[i].active = 0; 1077 } 1078 1079 + /* Look for an active buffer pool that can hold the new MTU */ 1080 + for(i = 0; i<IbmVethNumBufferPools; i++) { 1081 + adapter->rx_buff_pool[i].active = 1; 1082 + 1083 if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { 1084 + if (netif_running(adapter->netdev)) { 1085 adapter->pool_config = 1; 1086 ibmveth_close(adapter->netdev); 1087 adapter->pool_config = 0; ··· 1402 return -EPERM; 1403 } 1404 1405 if (netif_running(netdev)) { 1406 adapter->pool_config = 1; 1407 ibmveth_close(netdev); 1408 + pool->active = 0; 1409 adapter->pool_config = 0; 1410 if ((rc = ibmveth_open(netdev))) 1411 return rc; 1412 } 1413 + pool->active = 0; 1414 } 1415 } else if (attr == &veth_num_attr) { 1416 if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT)