Skip to content

Commit

Permalink
eventdev: fix device pointer for vdev-based devices
Browse files Browse the repository at this point in the history
[ upstream commit 928b5c701f254c64a7adb0051c0cfd25e8365584 ]

The eventdevs based on vdevs, rather than on e.g. HW PCI devices, were,
as a rule, not setting the ".dev" pointer in the eventdev structure.
This caused issues as a NULL pointer was returned in calls to info_get,
triggering crashes if the pointer is passed unchecked to e.g.
rte_dev_name() to print out the name of an event device.

Most effective, and future-proofed fix, is to not rely on the eventdev
drivers to set the pointer themselves, but to change the vdev init
function to take the vdev struct as parameter, and set the "dev" pointer
centrally on init. This allows us to fix all drivers in one go, enforced
by compiler error if the parameter is missing.

Fixes: aaa4a22 ("event/sw: add new software-only eventdev driver")
Fixes: 46a186b ("event/dsw: add device registration and build system")
Fixes: bbbb929 ("event/skeleton: add skeleton eventdev driver")
Fixes: 3c7f3dc ("event/opdl: add PMD main body and helper function")
Fixes: 9caac5d ("event/dpaa: introduce PMD")
Fixes: 8a5d7a8 ("event/dpaa2: initialize device")
Fixes: 34498de ("event/octeontx: add octeontx eventdev driver")

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: David Marchand <david.marchand@redhat.com>
  • Loading branch information
bruce-richardson authored and kevintraynor committed Nov 15, 2023
1 parent 6de3135 commit 48ecb47
Show file tree
Hide file tree
Showing 8 changed files with 15 additions and 14 deletions.
6 changes: 3 additions & 3 deletions drivers/event/dpaa/dpaa_eventdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -992,14 +992,14 @@ dpaa_event_check_flags(const char *params)
}

static int
dpaa_event_dev_create(const char *name, const char *params)
dpaa_event_dev_create(const char *name, const char *params, struct rte_vdev_device *vdev)
{
struct rte_eventdev *eventdev;
struct dpaa_eventdev *priv;

eventdev = rte_event_pmd_vdev_init(name,
sizeof(struct dpaa_eventdev),
rte_socket_id());
rte_socket_id(), vdev);
if (eventdev == NULL) {
DPAA_EVENTDEV_ERR("Failed to create eventdev vdev %s", name);
goto fail;
Expand Down Expand Up @@ -1049,7 +1049,7 @@ dpaa_event_dev_probe(struct rte_vdev_device *vdev)

params = rte_vdev_device_args(vdev);

return dpaa_event_dev_create(name, params);
return dpaa_event_dev_create(name, params, vdev);
}

static int
Expand Down
6 changes: 3 additions & 3 deletions drivers/event/dpaa2/dpaa2_eventdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ dpaa2_eventdev_setup_dpci(struct dpaa2_dpci_dev *dpci_dev,
}

static int
dpaa2_eventdev_create(const char *name)
dpaa2_eventdev_create(const char *name, struct rte_vdev_device *vdev)
{
struct rte_eventdev *eventdev;
struct dpaa2_eventdev *priv;
Expand All @@ -1093,7 +1093,7 @@ dpaa2_eventdev_create(const char *name)

eventdev = rte_event_pmd_vdev_init(name,
sizeof(struct dpaa2_eventdev),
rte_socket_id());
rte_socket_id(), vdev);
if (eventdev == NULL) {
DPAA2_EVENTDEV_ERR("Failed to create Event device %s", name);
goto fail;
Expand Down Expand Up @@ -1187,7 +1187,7 @@ dpaa2_eventdev_probe(struct rte_vdev_device *vdev)

name = rte_vdev_device_name(vdev);
DPAA2_EVENTDEV_INFO("Initializing %s", name);
return dpaa2_eventdev_create(name);
return dpaa2_eventdev_create(name, vdev);
}

static int
Expand Down
2 changes: 1 addition & 1 deletion drivers/event/dsw/dsw_evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ dsw_probe(struct rte_vdev_device *vdev)
name = rte_vdev_device_name(vdev);

dev = rte_event_pmd_vdev_init(name, sizeof(struct dsw_evdev),
rte_socket_id());
rte_socket_id(), vdev);
if (dev == NULL)
return -EFAULT;

Expand Down
2 changes: 1 addition & 1 deletion drivers/event/octeontx/ssovf_evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,7 @@ ssovf_vdev_probe(struct rte_vdev_device *vdev)
}

eventdev = rte_event_pmd_vdev_init(name, sizeof(struct ssovf_evdev),
rte_socket_id());
rte_socket_id(), vdev);
if (eventdev == NULL) {
ssovf_log_err("Failed to create eventdev vdev %s", name);
return -ENOMEM;
Expand Down
2 changes: 1 addition & 1 deletion drivers/event/opdl/opdl_evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ opdl_probe(struct rte_vdev_device *vdev)
}
}
dev = rte_event_pmd_vdev_init(name,
sizeof(struct opdl_evdev), socket_id);
sizeof(struct opdl_evdev), socket_id, vdev);

if (dev == NULL) {
PMD_DRV_LOG(ERR, "eventdev vdev init() failed");
Expand Down
6 changes: 3 additions & 3 deletions drivers/event/skeleton/skeleton_eventdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,12 +427,12 @@ RTE_PMD_REGISTER_PCI_TABLE(event_skeleton_pci, pci_id_skeleton_map);
/* VDEV based event device */

static int
skeleton_eventdev_create(const char *name, int socket_id)
skeleton_eventdev_create(const char *name, int socket_id, struct rte_vdev_device *vdev)
{
struct rte_eventdev *eventdev;

eventdev = rte_event_pmd_vdev_init(name,
sizeof(struct skeleton_eventdev), socket_id);
sizeof(struct skeleton_eventdev), socket_id, vdev);
if (eventdev == NULL) {
PMD_DRV_ERR("Failed to create eventdev vdev %s", name);
goto fail;
Expand All @@ -458,7 +458,7 @@ skeleton_eventdev_probe(struct rte_vdev_device *vdev)
name = rte_vdev_device_name(vdev);
RTE_LOG(INFO, PMD, "Initializing %s on NUMA node %d\n", name,
rte_socket_id());
return skeleton_eventdev_create(name, rte_socket_id());
return skeleton_eventdev_create(name, rte_socket_id(), vdev);
}

static int
Expand Down
2 changes: 1 addition & 1 deletion drivers/event/sw/sw_evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1077,7 +1077,7 @@ sw_probe(struct rte_vdev_device *vdev)
min_burst_size, deq_burst_size, refill_once);

dev = rte_event_pmd_vdev_init(name,
sizeof(struct sw_evdev), socket_id);
sizeof(struct sw_evdev), socket_id, vdev);
if (dev == NULL) {
SW_LOG_ERR("eventdev vdev init() failed");
return -EFAULT;
Expand Down
3 changes: 2 additions & 1 deletion lib/eventdev/eventdev_pmd_vdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extern "C" {
__rte_internal
static inline struct rte_eventdev *
rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
int socket_id)
int socket_id, struct rte_vdev_device *vdev)
{

struct rte_eventdev *eventdev;
Expand All @@ -66,6 +66,7 @@ rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
rte_panic("Cannot allocate memzone for private device"
" data");
}
eventdev->dev = &vdev->device;

return eventdev;
}
Expand Down

0 comments on commit 48ecb47

Please sign in to comment.