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 1054 { 1055 1055 struct ibmveth_adapter *adapter = dev->priv; 1056 1056 int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; 1057 - int reinit = 0; 1058 1057 int i, rc; 1059 1058 1060 1059 if (new_mtu < IBMVETH_MAX_MTU) ··· 1066 1067 if (i == IbmVethNumBufferPools) 1067 1068 return -EINVAL; 1068 1069 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; 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; 1074 1077 } 1075 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 + 1076 1083 if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { 1077 - if (reinit && netif_running(adapter->netdev)) { 1084 + if (netif_running(adapter->netdev)) { 1078 1085 adapter->pool_config = 1; 1079 1086 ibmveth_close(adapter->netdev); 1080 1087 adapter->pool_config = 0; ··· 1407 1402 return -EPERM; 1408 1403 } 1409 1404 1410 - pool->active = 0; 1411 1405 if (netif_running(netdev)) { 1412 1406 adapter->pool_config = 1; 1413 1407 ibmveth_close(netdev); 1408 + pool->active = 0; 1414 1409 adapter->pool_config = 0; 1415 1410 if ((rc = ibmveth_open(netdev))) 1416 1411 return rc; 1417 1412 } 1413 + pool->active = 0; 1418 1414 } 1419 1415 } else if (attr == &veth_num_attr) { 1420 1416 if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT)