Skip to content

Commit

Permalink
netdev-dpdk: Fix race condition in mempool information dump.
Browse files Browse the repository at this point in the history
Currently it is possible to call netdev-dpdk/get-mempool-info before a
mempool as been created. This can happen because a device is added to
the netdev_shash before a mempool is allocated for it, which results in
a segmentation fault.

Now we check for a NULL value before attempting to dereference it.

Fixes: be48173 ("netdev-dpdk: Add debug appctl to get mempool information.")
Signed-off-by: Mike Pattrick <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
mkp-rh authored and igsilya committed Aug 8, 2024
1 parent a5023d5 commit 9f0c6e1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
25 changes: 17 additions & 8 deletions lib/netdev-dpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -4637,10 +4637,11 @@ netdev_dpdk_get_mempool_info(struct unixctl_conn *conn,
int argc, const char *argv[],
void *aux OVS_UNUSED)
{
size_t size;
FILE *stream;
char *response = NULL;
struct netdev *netdev = NULL;
const char *error = NULL;
char *response = NULL;
FILE *stream;
size_t size;

if (argc == 2) {
netdev = netdev_from_name(argv[1]);
Expand All @@ -4664,10 +4665,14 @@ netdev_dpdk_get_mempool_info(struct unixctl_conn *conn,
ovs_mutex_lock(&dev->mutex);
ovs_mutex_lock(&dpdk_mp_mutex);

rte_mempool_dump(stream, dev->dpdk_mp->mp);
fprintf(stream, " count: avail (%u), in use (%u)\n",
rte_mempool_avail_count(dev->dpdk_mp->mp),
rte_mempool_in_use_count(dev->dpdk_mp->mp));
if (dev->dpdk_mp) {
rte_mempool_dump(stream, dev->dpdk_mp->mp);
fprintf(stream, " count: avail (%u), in use (%u)\n",
rte_mempool_avail_count(dev->dpdk_mp->mp),
rte_mempool_in_use_count(dev->dpdk_mp->mp));
} else {
error = "Not allocated";
}

ovs_mutex_unlock(&dpdk_mp_mutex);
ovs_mutex_unlock(&dev->mutex);
Expand All @@ -4679,7 +4684,11 @@ netdev_dpdk_get_mempool_info(struct unixctl_conn *conn,

fclose(stream);

unixctl_command_reply(conn, response);
if (error) {
unixctl_command_reply_error(conn, error);
} else {
unixctl_command_reply(conn, response);
}
out:
free(response);
netdev_close(netdev);
Expand Down
6 changes: 6 additions & 0 deletions tests/system-dpdk.at
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ ADD_VHOST_USER_CLIENT_PORT([br10], [dpdkvhostuserclient0], [$OVS_RUNDIR/dpdkvhos
AT_CHECK([ovs-vsctl show], [], [stdout])
sleep 2

dnl Check that no mempool was allocated.
AT_CHECK([ovs-appctl netdev-dpdk/get-mempool-info dpdkvhostuserclient0], [2], [], [dnl
Not allocated
ovs-appctl: ovs-vswitchd: server returned an error
])

dnl Clean up
AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr])
OVS_DPDK_STOP_VSWITCHD(["dnl
Expand Down

0 comments on commit 9f0c6e1

Please sign in to comment.