Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -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);
+2 −9
Original line number Diff line number Diff line
@@ -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;
};