for (i = 0; i < count; i++) {
struct rte_rawdev_info info = { .dev_private = NULL };
- if (rte_rawdev_info_get(i, &info) == 0 &&
+ if (rte_rawdev_info_get(i, &info, 0) == 0 &&
strstr(info.driver_name, "ioat") != NULL)
return rte_rawdev_selftest(i) == 0 ?
TEST_SUCCESS : TEST_FAILED;
for (i = 0; i < count && !found; i++) {
struct rte_rawdev_info info = { .dev_private = NULL };
- found = (rte_rawdev_info_get(i, &info) == 0 &&
+ found = (rte_rawdev_info_get(i, &info, 0) == 0 &&
strcmp(info.driver_name,
IOAT_PMD_RAWDEV_NAME_STR) == 0);
}
Also, make sure to start the actual text at the margin.
=======================================================
+* rawdev: Added a structure size parameter to the function
+ ``rte_rawdev_info_get()``,
+ allowing limited driver type-checking and ABI compatibility.
+
ABI Changes
-----------
do {
if (rdev_id == rte_rawdev_count())
goto end;
- rte_rawdev_info_get(rdev_id++, &rdev_info);
+ rte_rawdev_info_get(rdev_id++, &rdev_info, 0);
} while (strcmp(rdev_info.driver_name,
IOAT_PMD_RAWDEV_NAME_STR) != 0);
afu_dev->id.port = afu_pr_conf.afu_id.port;
if (rawdev->dev_ops && rawdev->dev_ops->dev_info_get)
- rawdev->dev_ops->dev_info_get(rawdev, afu_dev);
+ rawdev->dev_ops->dev_info_get(rawdev, afu_dev, sizeof(*afu_dev));
if (rawdev->dev_ops &&
rawdev->dev_ops->dev_start &&
static void
ifpga_rawdev_info_get(struct rte_rawdev *dev,
- rte_rawdev_obj_t dev_info)
+ rte_rawdev_obj_t dev_info,
+ size_t dev_info_size)
{
struct opae_adapter *adapter;
struct opae_accelerator *acc;
IFPGA_RAWDEV_PMD_FUNC_TRACE();
- if (!dev_info) {
+ if (!dev_info || dev_info_size != sizeof(*afu_dev)) {
IFPGA_RAWDEV_PMD_ERR("Invalid request");
return;
}
}
static void
-ioat_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info)
+ioat_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info,
+ size_t dev_info_size)
{
struct rte_ioat_rawdev_config *cfg = dev_info;
struct rte_ioat_rawdev *ioat = dev->dev_private;
- if (cfg != NULL)
+ if (cfg != NULL && dev_info_size == sizeof(*cfg))
cfg->ring_size = ioat->ring_size;
}
unsigned int nb_xstats;
unsigned int i;
- rte_rawdev_info_get(dev_id, &info);
+ rte_rawdev_info_get(dev_id, &info, sizeof(p));
if (p.ring_size != expected_ring_size) {
printf("Error, initial ring size is not as expected (Actual: %d, Expected: %d)\n",
(int)p.ring_size, expected_ring_size);
printf("Error with rte_rawdev_configure()\n");
return -1;
}
- rte_rawdev_info_get(dev_id, &info);
+ rte_rawdev_info_get(dev_id, &info, sizeof(p));
if (p.ring_size != IOAT_TEST_RINGSIZE) {
printf("Error, ring size is not %d (%d)\n",
IOAT_TEST_RINGSIZE, (int)p.ring_size);
}
static void
-ntb_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info)
+ntb_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info,
+ size_t dev_info_size)
{
struct ntb_hw *hw = dev->dev_private;
struct ntb_dev_info *info = dev_info;
+ if (dev_info_size != sizeof(*info)) {
+ NTB_LOG(ERR, "Invalid size parameter to %s", __func__);
+ return;
+ }
+
info->mw_cnt = hw->mw_cnt;
info->mw_size = hw->mw_size;
static void clear_queue_bufs(int queue_id);
static void skeleton_rawdev_info_get(struct rte_rawdev *dev,
- rte_rawdev_obj_t dev_info)
+ rte_rawdev_obj_t dev_info,
+ size_t dev_info_size)
{
struct skeleton_rawdev *skeldev;
struct skeleton_rawdev_conf *skeldev_conf;
SKELETON_PMD_FUNC_TRACE();
- if (!dev_info) {
+ if (!dev_info || dev_info_size != sizeof(*skeldev_conf)) {
SKELETON_PMD_ERR("Invalid request");
return;
}
struct rte_rawdev_info rdev_info = {0};
struct skeleton_rawdev_conf skel_conf = {0};
- ret = rte_rawdev_info_get(test_dev_id, NULL);
+ ret = rte_rawdev_info_get(test_dev_id, NULL, 0);
RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
rdev_info.dev_private = &skel_conf;
- ret = rte_rawdev_info_get(test_dev_id, &rdev_info);
+ ret = rte_rawdev_info_get(test_dev_id, &rdev_info, sizeof(skel_conf));
RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get raw dev info");
return TEST_SUCCESS;
rdev_info.dev_private = &rdev_conf_get;
ret = rte_rawdev_info_get(test_dev_id,
- (rte_rawdev_obj_t)&rdev_info);
+ (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_get));
RTE_TEST_ASSERT_SUCCESS(ret,
"Failed to obtain rawdev configuration (%d)",
ret);
/* Get the current configuration */
rdev_info.dev_private = &rdev_conf_get;
ret = rte_rawdev_info_get(test_dev_id,
- (rte_rawdev_obj_t)&rdev_info);
+ (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_get));
RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain rawdev configuration (%d)",
ret);
/* Get the current configuration */
rdev_info.dev_private = &rdev_conf_get;
ret = rte_rawdev_info_get(test_dev_id,
- (rte_rawdev_obj_t)&rdev_info);
+ (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_get));
RTE_TEST_ASSERT_SUCCESS(ret,
"Failed to obtain rawdev configuration (%d)",
ret);
dummy_firmware = NULL;
rte_rawdev_start(test_dev_id);
- ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info);
+ ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_get));
RTE_TEST_ASSERT_SUCCESS(ret,
"Failed to obtain rawdev configuration (%d)",
ret);
rdev_conf_get.device_state);
rte_rawdev_stop(test_dev_id);
- ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info);
+ ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_get));
RTE_TEST_ASSERT_SUCCESS(ret,
"Failed to obtain rawdev configuration (%d)",
ret);
do {
if (rdev_id == rte_rawdev_count())
goto end;
- rte_rawdev_info_get(rdev_id++, &rdev_info);
+ rte_rawdev_info_get(rdev_id++, &rdev_info, 0);
} while (rdev_info.driver_name == NULL ||
strcmp(rdev_info.driver_name,
IOAT_PMD_RAWDEV_NAME_STR) != 0);
rte_rawdev_set_attr(dev_id, NTB_QUEUE_NUM_NAME, num_queues);
printf("Set queue number as %u.\n", num_queues);
ntb_rawdev_info.dev_private = (rte_rawdev_obj_t)(&ntb_info);
- rte_rawdev_info_get(dev_id, &ntb_rawdev_info);
+ rte_rawdev_info_get(dev_id, &ntb_rawdev_info, sizeof(ntb_info));
nb_mbuf = nb_desc * num_queues * 2 * 2 + rte_lcore_count() *
MEMPOOL_CACHE_SIZE;
}
int
-rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info)
+rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
+ size_t dev_private_size)
{
struct rte_rawdev *rawdev;
if (dev_info->dev_private != NULL) {
RTE_FUNC_PTR_OR_ERR_RET(*rawdev->dev_ops->dev_info_get, -ENOTSUP);
- (*rawdev->dev_ops->dev_info_get)(rawdev, dev_info->dev_private);
+ (*rawdev->dev_ops->dev_info_get)(rawdev, dev_info->dev_private,
+ dev_private_size);
}
dev_info->driver_name = rawdev->driver_name;
* will be returned. This can be used to safely query the type of a rawdev
* instance without needing to know the size of the private data to return.
*
+ * @param dev_private_size
+ * The length of the memory space pointed to by dev_private in dev_info.
+ * This should be set to the size of the expected private structure to be
+ * returned, and may be checked by drivers to ensure the expected struct
+ * type is provided.
+ *
* @return
* - 0: Success, driver updates the contextual information of the raw device
* - <0: Error code returned by the driver info get function.
*
*/
int
-rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info);
+rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
+ size_t dev_private_size);
/**
* Configure a raw device.
* Raw device pointer
* @param dev_info
* Raw device information structure
+ * @param dev_private_size
+ * The size of the structure pointed to by dev_info->dev_private
*
* @return
* Returns 0 on success
*/
typedef void (*rawdev_info_get_t)(struct rte_rawdev *dev,
- rte_rawdev_obj_t dev_info);
+ rte_rawdev_obj_t dev_info,
+ size_t dev_private_size);
/**
* Configure a device.