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 <mkp@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
  • Loading branch information
mkp-rh authored and igsilya committed Aug 8, 2024
1 parent 9fe3279 commit 45124b0
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 @@ -3834,10 +3834,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 @@ -3861,10 +3862,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 @@ -3876,7 +3881,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 @@ -82,6 +82,12 @@ AT_CHECK([grep "VHOST_CONFIG: vhost-user client: socket created" ovs-vswitchd.lo
AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout])
AT_CHECK([grep "VHOST_CONFIG: $OVS_RUNDIR/dpdkvhostclient0: reconnecting..." ovs-vswitchd.log], [], [stdout])

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_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [
Expand Down

0 comments on commit 45124b0

Please sign in to comment.