Skip to content

Commit

Permalink
dpif-netdev: Add dpif-netdev/pmd-rxq-show appctl command.
Browse files Browse the repository at this point in the history
This command can be used to check the port/rxq assignment to
pmd threads. For each pmd thread of the datapath shows list
of queue-ids with port names.

Additionally log message from pmd_thread_main() extended with
queue-id, and type of this message changed from INFO to DBG.

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Acked-by: Flavio Leitner <fbl@sysclose.org>
Acked-by: Daniele Di Proietto <diproiettod@vmware.com>
  • Loading branch information
igsilya authored and ddiproietto committed Feb 23, 2016
1 parent e02b8fb commit ce179f1
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 22 deletions.
9 changes: 6 additions & 3 deletions INSTALL.DPDK.md
Expand Up @@ -272,9 +272,12 @@ Performance Tuning:

NIC port0 <-> OVS <-> VM <-> OVS <-> NIC port 1

The OVS log can be checked to confirm that the port/rxq assignment to
pmd threads is as required. This can also be checked with the following
commands:
The following command can be used to confirm that the port/rxq assignment
to pmd threads is as required:

`ovs-appctl dpif-netdev/pmd-rxq-show`

This can also be checked with:

```
top -H
Expand Down
3 changes: 3 additions & 0 deletions NEWS
Expand Up @@ -15,6 +15,9 @@ Post-v2.5.0
- DPDK:
* New option "n_rxq" for PMD interfaces.
Old 'other_config:n-dpdk-rxqs' is no longer supported.
* New appctl command 'dpif-netdev/pmd-rxq-show' to check the port/rxq
assignment.
* Type of log messages from PMD threads changed from INFO to DBG.
- ovs-benchmark: This utility has been removed due to lack of use and
bitrot.
- ovs-appctl:
Expand Down
77 changes: 58 additions & 19 deletions lib/dpif-netdev.c
Expand Up @@ -567,8 +567,9 @@ get_dp_netdev(const struct dpif *dpif)
}

enum pmd_info_type {
PMD_INFO_SHOW_STATS, /* show how cpu cycles are spent */
PMD_INFO_CLEAR_STATS /* set the cycles count to 0 */
PMD_INFO_SHOW_STATS, /* Show how cpu cycles are spent. */
PMD_INFO_CLEAR_STATS, /* Set the cycles count to 0. */
PMD_INFO_SHOW_RXQ /* Show poll-lists of pmd threads. */
};

static void
Expand Down Expand Up @@ -676,6 +677,35 @@ pmd_info_clear_stats(struct ds *reply OVS_UNUSED,
}
}

static void
pmd_info_show_rxq(struct ds *reply, struct dp_netdev_pmd_thread *pmd)
{
if (pmd->core_id != NON_PMD_CORE_ID) {
struct rxq_poll *poll;
const char *prev_name = NULL;

ds_put_format(reply, "pmd thread numa_id %d core_id %u:\n",
pmd->numa_id, pmd->core_id);

ovs_mutex_lock(&pmd->poll_mutex);
LIST_FOR_EACH (poll, node, &pmd->poll_list) {
const char *name = netdev_get_name(poll->port->netdev);

if (!prev_name || strcmp(name, prev_name)) {
if (prev_name) {
ds_put_cstr(reply, "\n");
}
ds_put_format(reply, "\tport: %s\tqueue-id:",
netdev_get_name(poll->port->netdev));
}
ds_put_format(reply, " %d", netdev_rxq_get_queue_id(poll->rx));
prev_name = name;
}
ovs_mutex_unlock(&pmd->poll_mutex);
ds_put_cstr(reply, "\n");
}
}

static void
dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[],
void *aux)
Expand All @@ -702,22 +732,26 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[],
}

CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
unsigned long long stats[DP_N_STATS];
uint64_t cycles[PMD_N_CYCLES];
int i;
if (type == PMD_INFO_SHOW_RXQ) {
pmd_info_show_rxq(&reply, pmd);
} else {
unsigned long long stats[DP_N_STATS];
uint64_t cycles[PMD_N_CYCLES];
int i;

/* Read current stats and cycle counters */
for (i = 0; i < ARRAY_SIZE(stats); i++) {
atomic_read_relaxed(&pmd->stats.n[i], &stats[i]);
}
for (i = 0; i < ARRAY_SIZE(cycles); i++) {
atomic_read_relaxed(&pmd->cycles.n[i], &cycles[i]);
}
/* Read current stats and cycle counters */
for (i = 0; i < ARRAY_SIZE(stats); i++) {
atomic_read_relaxed(&pmd->stats.n[i], &stats[i]);
}
for (i = 0; i < ARRAY_SIZE(cycles); i++) {
atomic_read_relaxed(&pmd->cycles.n[i], &cycles[i]);
}

if (type == PMD_INFO_CLEAR_STATS) {
pmd_info_clear_stats(&reply, pmd, stats, cycles);
} else if (type == PMD_INFO_SHOW_STATS) {
pmd_info_show_stats(&reply, pmd, stats, cycles);
if (type == PMD_INFO_CLEAR_STATS) {
pmd_info_clear_stats(&reply, pmd, stats, cycles);
} else if (type == PMD_INFO_SHOW_STATS) {
pmd_info_show_stats(&reply, pmd, stats, cycles);
}
}
}

Expand All @@ -731,14 +765,18 @@ static int
dpif_netdev_init(void)
{
static enum pmd_info_type show_aux = PMD_INFO_SHOW_STATS,
clear_aux = PMD_INFO_CLEAR_STATS;
clear_aux = PMD_INFO_CLEAR_STATS,
poll_aux = PMD_INFO_SHOW_RXQ;

unixctl_command_register("dpif-netdev/pmd-stats-show", "[dp]",
0, 1, dpif_netdev_pmd_info,
(void *)&show_aux);
unixctl_command_register("dpif-netdev/pmd-stats-clear", "[dp]",
0, 1, dpif_netdev_pmd_info,
(void *)&clear_aux);
unixctl_command_register("dpif-netdev/pmd-rxq-show", "[dp]",
0, 1, dpif_netdev_pmd_info,
(void *)&poll_aux);
return 0;
}

Expand Down Expand Up @@ -2684,8 +2722,9 @@ pmd_thread_main(void *f_)

/* List port/core affinity */
for (i = 0; i < poll_cnt; i++) {
VLOG_INFO("Core %d processing port \'%s\'\n", pmd->core_id,
netdev_get_name(poll_list[i].port->netdev));
VLOG_DBG("Core %d processing port \'%s\' with queue-id %d\n",
pmd->core_id, netdev_get_name(poll_list[i].port->netdev),
netdev_rxq_get_queue_id(poll_list[i].rx));
}

/* Signal here to make sure the pmd finishes
Expand Down
6 changes: 6 additions & 0 deletions lib/netdev.c
Expand Up @@ -1815,6 +1815,12 @@ netdev_rxq_get_name(const struct netdev_rxq *rx)
return netdev_get_name(netdev_rxq_get_netdev(rx));
}

int
netdev_rxq_get_queue_id(const struct netdev_rxq *rx)
{
return rx->queue_id;
}

static void
restore_all_flags(void *aux OVS_UNUSED)
{
Expand Down
1 change: 1 addition & 0 deletions lib/netdev.h
Expand Up @@ -175,6 +175,7 @@ int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id);
void netdev_rxq_close(struct netdev_rxq *);

const char *netdev_rxq_get_name(const struct netdev_rxq *);
int netdev_rxq_get_queue_id(const struct netdev_rxq *);

int netdev_rxq_recv(struct netdev_rxq *rx, struct dp_packet **buffers,
int *cnt);
Expand Down
3 changes: 3 additions & 0 deletions vswitchd/ovs-vswitchd.8.in
Expand Up @@ -256,6 +256,9 @@ measuring infrastructure.
Resets to zero the per pmd thread performance numbers shown by the
\fBdpif-netdev/pmd-stats-show\fR command. It will NOT reset datapath or
bridge statistics, only the values shown by the above command.
.IP "\fBdpif-netdev/pmd-rxq-show\fR [\fIdp\fR]"
For each pmd thread of the datapath \fIdp\fR shows list of queue-ids with
port names, which this thread polls.
.
.so ofproto/ofproto-dpif-unixctl.man
.so ofproto/ofproto-unixctl.man
Expand Down

0 comments on commit ce179f1

Please sign in to comment.