struct netdev_saved_flags *sf;
unsigned n_rxq; /* Number of elements in 'rxq' */
struct netdev_rxq **rxq;
- struct ovs_refcount ref_cnt;
char *type; /* Port type as requested by user. */
int latest_requested_n_rxq; /* Latest requested from netdev number
of rx queues. */
}
port->sf = sf;
- ovs_refcount_init(&port->ref_cnt);
cmap_insert(&dp->ports, &port->node, hash_port_no(port_no));
if (netdev_is_pmd(netdev)) {
}
static void
-port_ref(struct dp_netdev_port *port)
+port_destroy(struct dp_netdev_port *port)
{
- if (port) {
- ovs_refcount_ref(&port->ref_cnt);
+ if (!port) {
+ return;
}
-}
-
-static void
-port_unref(struct dp_netdev_port *port)
-{
- if (port && ovs_refcount_unref_relaxed(&port->ref_cnt) == 1) {
- int i;
- netdev_close(port->netdev);
- netdev_restore_flags(port->sf);
+ netdev_close(port->netdev);
+ netdev_restore_flags(port->sf);
- for (i = 0; i < port->n_rxq; i++) {
- netdev_rxq_close(port->rxq[i]);
- }
- free(port->rxq);
- free(port->type);
- free(port);
+ for (unsigned i = 0; i < port->n_rxq; i++) {
+ netdev_rxq_close(port->rxq[i]);
}
+
+ free(port->rxq);
+ free(port->type);
+ free(port);
}
static int
}
}
- port_unref(port);
+ port_destroy(port);
}
static void
}
static int
-pmd_load_queues(struct dp_netdev_pmd_thread *pmd,
- struct rxq_poll **ppoll_list, int poll_cnt)
+pmd_load_queues(struct dp_netdev_pmd_thread *pmd, struct rxq_poll **ppoll_list)
OVS_REQUIRES(pmd->poll_mutex)
{
struct rxq_poll *poll_list = *ppoll_list;
struct rxq_poll *poll;
int i;
- for (i = 0; i < poll_cnt; i++) {
- port_unref(poll_list[i].port);
- }
-
poll_list = xrealloc(poll_list, pmd->poll_cnt * sizeof *poll_list);
i = 0;
LIST_FOR_EACH (poll, node, &pmd->poll_list) {
- port_ref(poll->port);
poll_list[i++] = *poll;
}
emc_cache_init(&pmd->flow_cache);
ovs_mutex_lock(&pmd->poll_mutex);
- poll_cnt = pmd_load_queues(pmd, &poll_list, poll_cnt);
+ poll_cnt = pmd_load_queues(pmd, &poll_list);
ovs_mutex_unlock(&pmd->poll_mutex);
/* List port/core affinity */
goto reload;
}
- for (i = 0; i < poll_cnt; i++) {
- port_unref(poll_list[i].port);
- }
-
dp_netdev_pmd_reload_done(pmd);
free(poll_list);
ovs_mutex_lock(&pmd->poll_mutex);
LIST_FOR_EACH_POP (poll, node, &pmd->poll_list) {
- port_unref(poll->port);
free(poll);
}
pmd->poll_cnt = 0;
LIST_FOR_EACH_SAFE (poll, next, node, &pmd->poll_list) {
if (poll->port == port) {
found = true;
- port_unref(poll->port);
ovs_list_remove(&poll->node);
pmd->poll_cnt--;
free(poll);
{
struct rxq_poll *poll = xmalloc(sizeof *poll);
- port_ref(port);
poll->port = port;
poll->rx = rx;