Commit e1f1e5f7 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

sunvnet: track port queues correctly

Track our used and unused queue indexies correctly.  Otherwise, as ports
dropped out and returned, they all eventually ended up with the same
queue index.

Orabug: 25190537
Signed-off-by: default avatarShannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0f512c84
......@@ -1728,11 +1728,25 @@ EXPORT_SYMBOL_GPL(sunvnet_poll_controller_common);
void sunvnet_port_add_txq_common(struct vnet_port *port)
{
struct vnet *vp = port->vp;
int n;
int smallest = 0;
int i;
/* find the first least-used q
* When there are more ldoms than q's, we start to
* double up on ports per queue.
*/
for (i = 0; i < VNET_MAX_TXQS; i++) {
if (vp->q_used[i] == 0) {
smallest = i;
break;
}
if (vp->q_used[i] < vp->q_used[smallest])
smallest = i;
}
n = vp->nports++;
n = n & (VNET_MAX_TXQS - 1);
port->q_index = n;
vp->nports++;
vp->q_used[smallest]++;
port->q_index = smallest;
netif_tx_wake_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
port->q_index));
}
......@@ -1743,5 +1757,7 @@ void sunvnet_port_rm_txq_common(struct vnet_port *port)
port->vp->nports--;
netif_tx_stop_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
port->q_index));
port->vp->q_used[port->q_index]--;
port->q_index = 0;
}
EXPORT_SYMBOL_GPL(sunvnet_port_rm_txq_common);
......@@ -112,22 +112,15 @@ struct vnet_mcast_entry {
};
struct vnet {
/* Protects port_list and port_hash. */
spinlock_t lock;
spinlock_t lock; /* Protects port_list and port_hash. */
struct net_device *dev;
u32 msg_enable;
u8 q_used[VNET_MAX_TXQS];
struct list_head port_list;
struct hlist_head port_hash[VNET_PORT_HASH_SIZE];
struct vnet_mcast_entry *mcast_list;
struct list_head list;
u64 local_mac;
int nports;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment