mirror of
https://github.com/openvswitch/ovs
synced 2025-09-04 08:15:25 +00:00
dpif-netdev: Add functions to modify rxq without reloading pmd threads.
This commit introduces some functions to add/remove rxqs from pmd threads without reloading them. They will be used by next commits. Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Ilya Maximets <i.maximets@samsung.com> Acked-by: Ilya Maximets <i.maximets@samsung.com>
This commit is contained in:
@@ -495,8 +495,6 @@ static void dp_netdev_destroy_all_pmds(struct dp_netdev *dp);
|
|||||||
static void dp_netdev_del_pmds_on_numa(struct dp_netdev *dp, int numa_id);
|
static void dp_netdev_del_pmds_on_numa(struct dp_netdev *dp, int numa_id);
|
||||||
static void dp_netdev_set_pmds_on_numa(struct dp_netdev *dp, int numa_id);
|
static void dp_netdev_set_pmds_on_numa(struct dp_netdev *dp, int numa_id);
|
||||||
static void dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd);
|
static void dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd);
|
||||||
static void dp_netdev_del_port_from_pmd(struct dp_netdev_port *port,
|
|
||||||
struct dp_netdev_pmd_thread *pmd);
|
|
||||||
static void dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
|
static void dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
|
||||||
struct dp_netdev_port *port);
|
struct dp_netdev_port *port);
|
||||||
static void
|
static void
|
||||||
@@ -3012,11 +3010,11 @@ dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd)
|
|||||||
ovs_mutex_unlock(&pmd->poll_mutex);
|
ovs_mutex_unlock(&pmd->poll_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deletes all rx queues of 'port' from poll_list of pmd thread and
|
/* Deletes all rx queues of 'port' from poll_list of pmd thread. Returns true
|
||||||
* reloads it if poll_list was changed. */
|
* if 'port' was found in 'pmd' (therefore a restart is required). */
|
||||||
static void
|
static bool
|
||||||
dp_netdev_del_port_from_pmd(struct dp_netdev_port *port,
|
dp_netdev_del_port_from_pmd__(struct dp_netdev_port *port,
|
||||||
struct dp_netdev_pmd_thread *pmd)
|
struct dp_netdev_pmd_thread *pmd)
|
||||||
{
|
{
|
||||||
struct rxq_poll *poll, *next;
|
struct rxq_poll *poll, *next;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
@@ -3031,8 +3029,30 @@ dp_netdev_del_port_from_pmd(struct dp_netdev_port *port,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ovs_mutex_unlock(&pmd->poll_mutex);
|
ovs_mutex_unlock(&pmd->poll_mutex);
|
||||||
if (found) {
|
|
||||||
dp_netdev_reload_pmd__(pmd);
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deletes all rx queues of 'port' from all pmd threads. The pmd threads that
|
||||||
|
* need to be restarted are inserted in 'to_reload'. */
|
||||||
|
static void
|
||||||
|
dp_netdev_del_port_from_all_pmds__(struct dp_netdev *dp,
|
||||||
|
struct dp_netdev_port *port,
|
||||||
|
struct hmapx *to_reload)
|
||||||
|
{
|
||||||
|
int numa_id = netdev_get_numa_id(port->netdev);
|
||||||
|
struct dp_netdev_pmd_thread *pmd;
|
||||||
|
|
||||||
|
CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
|
||||||
|
if (pmd->numa_id == numa_id) {
|
||||||
|
bool found;
|
||||||
|
|
||||||
|
found = dp_netdev_del_port_from_pmd__(port, pmd);
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
hmapx_add(to_reload, pmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3042,16 +3062,21 @@ static void
|
|||||||
dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
|
dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
|
||||||
struct dp_netdev_port *port)
|
struct dp_netdev_port *port)
|
||||||
{
|
{
|
||||||
int numa_id = netdev_get_numa_id(port->netdev);
|
|
||||||
struct dp_netdev_pmd_thread *pmd;
|
struct dp_netdev_pmd_thread *pmd;
|
||||||
|
struct hmapx to_reload = HMAPX_INITIALIZER(&to_reload);
|
||||||
|
struct hmapx_node *node;
|
||||||
|
|
||||||
CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
|
dp_netdev_del_port_from_all_pmds__(dp, port, &to_reload);
|
||||||
if (pmd->numa_id == numa_id) {
|
|
||||||
dp_netdev_del_port_from_pmd(port, pmd);
|
HMAPX_FOR_EACH (node, &to_reload) {
|
||||||
}
|
pmd = (struct dp_netdev_pmd_thread *) node->data;
|
||||||
|
dp_netdev_reload_pmd__(pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hmapx_destroy(&to_reload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Returns PMD thread from this numa node with fewer rx queues to poll.
|
/* Returns PMD thread from this numa node with fewer rx queues to poll.
|
||||||
* Returns NULL if there is no PMD threads on this numa node.
|
* Returns NULL if there is no PMD threads on this numa node.
|
||||||
* Can be called safely only by main thread. */
|
* Can be called safely only by main thread. */
|
||||||
@@ -3087,18 +3112,16 @@ dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd,
|
|||||||
pmd->poll_cnt++;
|
pmd->poll_cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Distributes all rx queues of 'port' between all PMD threads and reloads
|
/* Distributes all rx queues of 'port' between all PMD threads in 'dp'. The
|
||||||
* them if needed. */
|
* pmd threads that need to be restarted are inserted in 'to_reload'. */
|
||||||
static void
|
static void
|
||||||
dp_netdev_add_port_to_pmds(struct dp_netdev *dp, struct dp_netdev_port *port)
|
dp_netdev_add_port_to_pmds__(struct dp_netdev *dp, struct dp_netdev_port *port,
|
||||||
|
struct hmapx *to_reload)
|
||||||
{
|
{
|
||||||
int numa_id = netdev_get_numa_id(port->netdev);
|
int numa_id = netdev_get_numa_id(port->netdev);
|
||||||
struct dp_netdev_pmd_thread *pmd;
|
struct dp_netdev_pmd_thread *pmd;
|
||||||
struct hmapx to_reload;
|
|
||||||
struct hmapx_node *node;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
hmapx_init(&to_reload);
|
|
||||||
/* Cannot create pmd threads for invalid numa node. */
|
/* Cannot create pmd threads for invalid numa node. */
|
||||||
ovs_assert(ovs_numa_numa_id_is_valid(numa_id));
|
ovs_assert(ovs_numa_numa_id_is_valid(numa_id));
|
||||||
|
|
||||||
@@ -3115,8 +3138,20 @@ dp_netdev_add_port_to_pmds(struct dp_netdev *dp, struct dp_netdev_port *port)
|
|||||||
dp_netdev_add_rxq_to_pmd(pmd, port, port->rxq[i]);
|
dp_netdev_add_rxq_to_pmd(pmd, port, port->rxq[i]);
|
||||||
ovs_mutex_unlock(&pmd->poll_mutex);
|
ovs_mutex_unlock(&pmd->poll_mutex);
|
||||||
|
|
||||||
hmapx_add(&to_reload, pmd);
|
hmapx_add(to_reload, pmd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Distributes all rx queues of 'port' between all PMD threads in 'dp' and
|
||||||
|
* reloads them, if needed. */
|
||||||
|
static void
|
||||||
|
dp_netdev_add_port_to_pmds(struct dp_netdev *dp, struct dp_netdev_port *port)
|
||||||
|
{
|
||||||
|
struct dp_netdev_pmd_thread *pmd;
|
||||||
|
struct hmapx to_reload = HMAPX_INITIALIZER(&to_reload);
|
||||||
|
struct hmapx_node *node;
|
||||||
|
|
||||||
|
dp_netdev_add_port_to_pmds__(dp, port, &to_reload);
|
||||||
|
|
||||||
HMAPX_FOR_EACH (node, &to_reload) {
|
HMAPX_FOR_EACH (node, &to_reload) {
|
||||||
pmd = (struct dp_netdev_pmd_thread *) node->data;
|
pmd = (struct dp_netdev_pmd_thread *) node->data;
|
||||||
|
Reference in New Issue
Block a user