eal: fix positive error codes from probe/remove
According to API, 'rte_dev_probe()' and 'rte_dev_remove()' must return 0 or negative error code. Bus code returns positive values if device wasn't recognized by any driver, so the result of 'bus->plug/unplug()' must be converted. 'local_dev_probe()' and 'local_dev_remove()' also has their internal API, so the conversion should be done there. Positive on remove means that device not found by driver. Positive on probe means that there are no suitable buses/drivers, i.e. device is not supported. Users of these API fixed to provide a good example by respecting DPDK API. This also will allow to catch such issues in the future. Fixes:a3ee360f44
("eal: add hotplug add/remove device") Fixes:244d513071
("eal: enable hotplug on multi-process") Cc: stable@dpdk.org Signed-off-by: Ilya Maximets <i.maximets@samsung.com> Reviewed-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
parent
18218713bf
commit
75b66decdb
@ -2383,7 +2383,7 @@ attach_port(char *identifier)
|
||||
return;
|
||||
}
|
||||
|
||||
if (rte_dev_probe(identifier) != 0) {
|
||||
if (rte_dev_probe(identifier) < 0) {
|
||||
TESTPMD_LOG(ERR, "Failed to attach port %s\n", identifier);
|
||||
return;
|
||||
}
|
||||
@ -2453,7 +2453,7 @@ detach_port_device(portid_t port_id)
|
||||
port_flow_flush(port_id);
|
||||
}
|
||||
|
||||
if (rte_dev_remove(dev) != 0) {
|
||||
if (rte_dev_remove(dev) < 0) {
|
||||
TESTPMD_LOG(ERR, "Failed to detach device %s\n", dev->name);
|
||||
return;
|
||||
}
|
||||
|
@ -374,7 +374,7 @@ rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
|
||||
}
|
||||
if (!devargs_already_listed(&devargs)) {
|
||||
ret = rte_dev_probe(devargs.name);
|
||||
if (ret != 0) {
|
||||
if (ret < 0) {
|
||||
ERROR("Failed to probe devargs %s",
|
||||
devargs.name);
|
||||
continue;
|
||||
|
@ -48,7 +48,7 @@ fs_bus_init(struct rte_eth_dev *dev)
|
||||
ret = rte_eal_hotplug_add(da->bus->name,
|
||||
da->name,
|
||||
da->args);
|
||||
if (ret) {
|
||||
if (ret < 0) {
|
||||
ERROR("sub_device %d probe failed %s%s%s", i,
|
||||
rte_errno ? "(" : "",
|
||||
rte_errno ? strerror(rte_errno) : "",
|
||||
@ -147,7 +147,7 @@ fs_bus_uninit(struct rte_eth_dev *dev)
|
||||
|
||||
FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_PROBED) {
|
||||
sdev_ret = rte_dev_remove(sdev->dev);
|
||||
if (sdev_ret) {
|
||||
if (sdev_ret < 0) {
|
||||
ERROR("Failed to remove requested device %s (err: %d)",
|
||||
sdev->dev->name, sdev_ret);
|
||||
continue;
|
||||
|
@ -284,7 +284,7 @@ fs_dev_remove(struct sub_device *sdev)
|
||||
/* fallthrough */
|
||||
case DEV_PROBED:
|
||||
ret = rte_dev_remove(sdev->dev);
|
||||
if (ret) {
|
||||
if (ret < 0) {
|
||||
ERROR("Bus detach failed for sub_device %u",
|
||||
SUB_ID(sdev));
|
||||
} else {
|
||||
|
@ -633,7 +633,7 @@ vdev_netvsc_netvsc_probe(const struct if_nameindex *iface,
|
||||
ctx->devname, ctx->devargs);
|
||||
vdev_netvsc_foreach_iface(vdev_netvsc_device_probe, 0, ctx);
|
||||
ret = rte_eal_hotplug_add("vdev", ctx->devname, ctx->devargs);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
LIST_INSERT_HEAD(&vdev_netvsc_ctx_list, ctx, entry);
|
||||
++vdev_netvsc_ctx_count;
|
||||
|
@ -172,6 +172,9 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev)
|
||||
*/
|
||||
|
||||
ret = dev->bus->plug(dev);
|
||||
if (ret > 0)
|
||||
ret = -ENOTSUP;
|
||||
|
||||
if (ret && !rte_dev_is_probed(dev)) { /* if hasn't ever succeeded */
|
||||
RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n",
|
||||
dev->name);
|
||||
@ -319,7 +322,7 @@ local_dev_remove(struct rte_device *dev)
|
||||
if (ret) {
|
||||
RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n",
|
||||
dev->name);
|
||||
return ret;
|
||||
return (ret < 0) ? ret : -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user