[20.11,3/5] rawdev: add private data length parameter to config fn

Message ID 20200709152047.167730-4-bruce.richardson@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Enhance rawdev APIs |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail apply issues

Commit Message

Bruce Richardson July 9, 2020, 3:20 p.m. UTC
  Currently with the rawdev API there is no way to check that the structure
passed in via the dev_private pointer in the structure passed to configure
API is of the correct type - it's just checked that it is non-NULL. Adding
in the length of the expected structure provides a measure of typechecking,
and can also be used for ABI compatibility in future, since ABI changes
involving structs almost always involve a change in size.

Signed-off-by:  Bruce Richardson <bruce.richardson@intel.com>
---
 drivers/raw/ifpga/ifpga_rawdev.c            | 3 ++-
 drivers/raw/ioat/ioat_rawdev.c              | 5 +++--
 drivers/raw/ioat/ioat_rawdev_test.c         | 2 +-
 drivers/raw/ntb/ntb.c                       | 6 +++++-
 drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c | 7 ++++---
 drivers/raw/octeontx2_dma/otx2_dpi_test.c   | 3 ++-
 drivers/raw/octeontx2_ep/otx2_ep_rawdev.c   | 7 ++++---
 drivers/raw/octeontx2_ep/otx2_ep_test.c     | 2 +-
 drivers/raw/skeleton/skeleton_rawdev.c      | 5 +++--
 drivers/raw/skeleton/skeleton_rawdev_test.c | 5 +++--
 examples/ioat/ioatfwd.c                     | 2 +-
 examples/ntb/ntb_fwd.c                      | 2 +-
 lib/librte_rawdev/rte_rawdev.c              | 6 ++++--
 lib/librte_rawdev/rte_rawdev.h              | 8 +++++++-
 lib/librte_rawdev/rte_rawdev_pmd.h          | 3 ++-
 15 files changed, 43 insertions(+), 23 deletions(-)
  

Comments

Xu, Rosen July 12, 2020, 2:13 p.m. UTC | #1
Hi,

Reviewed-by: Rosen Xu <rosen.xu@intel.com>

> -----Original Message-----
> From: Richardson, Bruce <bruce.richardson@intel.com>
> Sent: Thursday, July 09, 2020 23:21
> To: Nipun Gupta <nipun.gupta@nxp.com>; Hemant Agrawal
> <hemant.agrawal@nxp.com>
> Cc: dev@dpdk.org; Xu, Rosen <rosen.xu@intel.com>; Zhang, Tianfei
> <tianfei.zhang@intel.com>; Li, Xiaoyun <xiaoyun.li@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Satha Rao <skoteshwar@marvell.com>; Mahipal
> Challa <mchalla@marvell.com>; Jerin Jacob <jerinj@marvell.com>;
> Richardson, Bruce <bruce.richardson@intel.com>
> Subject: [PATCH 20.11 3/5] rawdev: add private data length parameter to
> config fn
> 
> Currently with the rawdev API there is no way to check that the structure
> passed in via the dev_private pointer in the structure passed to configure API
> is of the correct type - it's just checked that it is non-NULL. Adding in the
> length of the expected structure provides a measure of typechecking, and
> can also be used for ABI compatibility in future, since ABI changes involving
> structs almost always involve a change in size.
> 
> Signed-off-by:  Bruce Richardson <bruce.richardson@intel.com>
> ---
>  drivers/raw/ifpga/ifpga_rawdev.c            | 3 ++-
>  drivers/raw/ioat/ioat_rawdev.c              | 5 +++--
>  drivers/raw/ioat/ioat_rawdev_test.c         | 2 +-
>  drivers/raw/ntb/ntb.c                       | 6 +++++-
>  drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c | 7 ++++---
>  drivers/raw/octeontx2_dma/otx2_dpi_test.c   | 3 ++-
>  drivers/raw/octeontx2_ep/otx2_ep_rawdev.c   | 7 ++++---
>  drivers/raw/octeontx2_ep/otx2_ep_test.c     | 2 +-
>  drivers/raw/skeleton/skeleton_rawdev.c      | 5 +++--
>  drivers/raw/skeleton/skeleton_rawdev_test.c | 5 +++--
>  examples/ioat/ioatfwd.c                     | 2 +-
>  examples/ntb/ntb_fwd.c                      | 2 +-
>  lib/librte_rawdev/rte_rawdev.c              | 6 ++++--
>  lib/librte_rawdev/rte_rawdev.h              | 8 +++++++-
>  lib/librte_rawdev/rte_rawdev_pmd.h          | 3 ++-
>  15 files changed, 43 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/raw/ifpga/ifpga_rawdev.c
> b/drivers/raw/ifpga/ifpga_rawdev.c
> index 32a2b96c9..a50173264 100644
> --- a/drivers/raw/ifpga/ifpga_rawdev.c
> +++ b/drivers/raw/ifpga/ifpga_rawdev.c
> @@ -684,7 +684,8 @@ ifpga_rawdev_info_get(struct rte_rawdev *dev,
> 
>  static int
>  ifpga_rawdev_configure(const struct rte_rawdev *dev,
> -		rte_rawdev_obj_t config)
> +		rte_rawdev_obj_t config,
> +		size_t config_size __rte_unused)
>  {
>  	IFPGA_RAWDEV_PMD_FUNC_TRACE();
> 
> diff --git a/drivers/raw/ioat/ioat_rawdev.c b/drivers/raw/ioat/ioat_rawdev.c
> index 6a336795d..b29ff983f 100644
> --- a/drivers/raw/ioat/ioat_rawdev.c
> +++ b/drivers/raw/ioat/ioat_rawdev.c
> @@ -41,7 +41,8 @@ RTE_LOG_REGISTER(ioat_pmd_logtype, rawdev.ioat,
> INFO);  #define COMPLETION_SZ sizeof(__m128i)
> 
>  static int
> -ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
> +ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t
> config,
> +		size_t config_size)
>  {
>  	struct rte_ioat_rawdev_config *params = config;
>  	struct rte_ioat_rawdev *ioat = dev->dev_private; @@ -51,7 +52,7
> @@ ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t
> config)
>  	if (dev->started)
>  		return -EBUSY;
> 
> -	if (params == NULL)
> +	if (params == NULL || config_size != sizeof(*params))
>  		return -EINVAL;
> 
>  	if (params->ring_size > 4096 || params->ring_size < 64 || diff --git
> a/drivers/raw/ioat/ioat_rawdev_test.c
> b/drivers/raw/ioat/ioat_rawdev_test.c
> index 90f5974cd..e5b50ae9f 100644
> --- a/drivers/raw/ioat/ioat_rawdev_test.c
> +++ b/drivers/raw/ioat/ioat_rawdev_test.c
> @@ -165,7 +165,7 @@ ioat_rawdev_test(uint16_t dev_id)
>  	}
> 
>  	p.ring_size = IOAT_TEST_RINGSIZE;
> -	if (rte_rawdev_configure(dev_id, &info) != 0) {
> +	if (rte_rawdev_configure(dev_id, &info, sizeof(p)) != 0) {
>  		printf("Error with rte_rawdev_configure()\n");
>  		return -1;
>  	}
> diff --git a/drivers/raw/ntb/ntb.c b/drivers/raw/ntb/ntb.c index
> eaeb67b74..c181094d5 100644
> --- a/drivers/raw/ntb/ntb.c
> +++ b/drivers/raw/ntb/ntb.c
> @@ -837,13 +837,17 @@ ntb_dev_info_get(struct rte_rawdev *dev,
> rte_rawdev_obj_t dev_info,  }
> 
>  static int
> -ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
> +ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t
> config,
> +		size_t config_size)
>  {
>  	struct ntb_dev_config *conf = config;
>  	struct ntb_hw *hw = dev->dev_private;
>  	uint32_t xstats_num;
>  	int ret;
> 
> +	if (conf == NULL || config_size != sizeof(*conf))
> +		return -EINVAL;
> +
>  	hw->queue_pairs	= conf->num_queues;
>  	hw->queue_size = conf->queue_size;
>  	hw->used_mw_num = conf->mz_num;
> diff --git a/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
> b/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
> index e398abb75..5b496446c 100644
> --- a/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
> +++ b/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
> @@ -294,7 +294,8 @@ otx2_dpi_rawdev_reset(struct rte_rawdev *dev)  }
> 
>  static int
> -otx2_dpi_rawdev_configure(const struct rte_rawdev *dev,
> rte_rawdev_obj_t config)
> +otx2_dpi_rawdev_configure(const struct rte_rawdev *dev,
> rte_rawdev_obj_t config,
> +		size_t config_size)
>  {
>  	struct dpi_rawdev_conf_s *conf = config;
>  	struct dpi_vf_s *dpivf = NULL;
> @@ -302,8 +303,8 @@ otx2_dpi_rawdev_configure(const struct rte_rawdev
> *dev, rte_rawdev_obj_t config)
>  	uintptr_t pool;
>  	uint32_t gaura;
> 
> -	if (conf == NULL) {
> -		otx2_dpi_dbg("NULL configuration");
> +	if (conf == NULL || config_size != sizeof(*conf)) {
> +		otx2_dpi_dbg("NULL or invalid configuration");
>  		return -EINVAL;
>  	}
>  	dpivf = (struct dpi_vf_s *)dev->dev_private; diff --git
> a/drivers/raw/octeontx2_dma/otx2_dpi_test.c
> b/drivers/raw/octeontx2_dma/otx2_dpi_test.c
> index 276658af0..cec6ca91b 100644
> --- a/drivers/raw/octeontx2_dma/otx2_dpi_test.c
> +++ b/drivers/raw/octeontx2_dma/otx2_dpi_test.c
> @@ -182,7 +182,8 @@ test_otx2_dma_rawdev(uint16_t val)
>  	/* Configure rawdev ports */
>  	conf.chunk_pool = dpi_create_mempool();
>  	rdev_info.dev_private = &conf;
> -	ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info);
> +	ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info,
> +			sizeof(conf));
>  	if (ret) {
>  		otx2_dpi_dbg("Unable to configure DPIVF %d", i);
>  		return -ENODEV;
> diff --git a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
> b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
> index 0778603d5..2b78a7941 100644
> --- a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
> +++ b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
> @@ -224,13 +224,14 @@ sdp_rawdev_close(struct rte_rawdev *dev)  }
> 
>  static int
> -sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t
> config)
> +sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t
> config,
> +		size_t config_size)
>  {
>  	struct sdp_rawdev_info *app_info = (struct sdp_rawdev_info
> *)config;
>  	struct sdp_device *sdpvf;
> 
> -	if (app_info == NULL) {
> -		otx2_err("Application config info [NULL]");
> +	if (app_info == NULL || config_size != sizeof(*app_info)) {
> +		otx2_err("Application config info [NULL] or incorrect size");
>  		return -EINVAL;
>  	}
> 
> diff --git a/drivers/raw/octeontx2_ep/otx2_ep_test.c
> b/drivers/raw/octeontx2_ep/otx2_ep_test.c
> index 091f1827c..b876275f7 100644
> --- a/drivers/raw/octeontx2_ep/otx2_ep_test.c
> +++ b/drivers/raw/octeontx2_ep/otx2_ep_test.c
> @@ -108,7 +108,7 @@ sdp_rawdev_selftest(uint16_t dev_id)
> 
>  	dev_info.dev_private = &app_info;
> 
> -	ret = rte_rawdev_configure(dev_id, &dev_info);
> +	ret = rte_rawdev_configure(dev_id, &dev_info, sizeof(app_info));
>  	if (ret) {
>  		otx2_err("Unable to configure SDP_VF %d", dev_id);
>  		rte_mempool_free(ioq_mpool);
> diff --git a/drivers/raw/skeleton/skeleton_rawdev.c
> b/drivers/raw/skeleton/skeleton_rawdev.c
> index dce300c35..531d0450c 100644
> --- a/drivers/raw/skeleton/skeleton_rawdev.c
> +++ b/drivers/raw/skeleton/skeleton_rawdev.c
> @@ -68,7 +68,8 @@ static int skeleton_rawdev_info_get(struct rte_rawdev
> *dev,  }
> 
>  static int skeleton_rawdev_configure(const struct rte_rawdev *dev,
> -				     rte_rawdev_obj_t config)
> +				     rte_rawdev_obj_t config,
> +				     size_t config_size)
>  {
>  	struct skeleton_rawdev *skeldev;
>  	struct skeleton_rawdev_conf *skeldev_conf; @@ -77,7 +78,7 @@
> static int skeleton_rawdev_configure(const struct rte_rawdev *dev,
> 
>  	RTE_FUNC_PTR_OR_ERR_RET(dev, -EINVAL);
> 
> -	if (!config) {
> +	if (config == NULL || config_size != sizeof(*skeldev_conf)) {
>  		SKELETON_PMD_ERR("Invalid configuration");
>  		return -EINVAL;
>  	}
> diff --git a/drivers/raw/skeleton/skeleton_rawdev_test.c
> b/drivers/raw/skeleton/skeleton_rawdev_test.c
> index 9b8390dfb..7dc7c7684 100644
> --- a/drivers/raw/skeleton/skeleton_rawdev_test.c
> +++ b/drivers/raw/skeleton/skeleton_rawdev_test.c
> @@ -126,7 +126,7 @@ test_rawdev_configure(void)
>  	struct skeleton_rawdev_conf rdev_conf_get = {0};
> 
>  	/* Check invalid configuration */
> -	ret = rte_rawdev_configure(test_dev_id, NULL);
> +	ret = rte_rawdev_configure(test_dev_id, NULL, 0);
>  	RTE_TEST_ASSERT(ret == -EINVAL,
>  			"Null configure; Expected -EINVAL, got %d", ret);
> 
> @@ -137,7 +137,8 @@ test_rawdev_configure(void)
> 
>  	rdev_info.dev_private = &rdev_conf_set;
>  	ret = rte_rawdev_configure(test_dev_id,
> -				   (rte_rawdev_obj_t)&rdev_info);
> +				   (rte_rawdev_obj_t)&rdev_info,
> +				   sizeof(rdev_conf_set));
>  	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure rawdev (%d)",
> ret);
> 
>  	rdev_info.dev_private = &rdev_conf_get; diff --git
> a/examples/ioat/ioatfwd.c b/examples/ioat/ioatfwd.c index
> 5c631da1b..8e9513e44 100644
> --- a/examples/ioat/ioatfwd.c
> +++ b/examples/ioat/ioatfwd.c
> @@ -734,7 +734,7 @@ configure_rawdev_queue(uint32_t dev_id)
>  	struct rte_ioat_rawdev_config dev_config = { .ring_size = ring_size };
>  	struct rte_rawdev_info info = { .dev_private = &dev_config };
> 
> -	if (rte_rawdev_configure(dev_id, &info) != 0) {
> +	if (rte_rawdev_configure(dev_id, &info, sizeof(dev_config)) != 0) {
>  		rte_exit(EXIT_FAILURE,
>  			"Error with rte_rawdev_configure()\n");
>  	}
> diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c index
> 11e224451..656f73659 100644
> --- a/examples/ntb/ntb_fwd.c
> +++ b/examples/ntb/ntb_fwd.c
> @@ -1401,7 +1401,7 @@ main(int argc, char **argv)
>  	ntb_conf.num_queues = num_queues;
>  	ntb_conf.queue_size = nb_desc;
>  	ntb_rawdev_conf.dev_private = (rte_rawdev_obj_t)(&ntb_conf);
> -	ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf);
> +	ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf,
> +sizeof(ntb_conf));
>  	if (ret)
>  		rte_exit(EXIT_FAILURE, "Can't config ntb dev: err=%d, "
>  			"port=%u\n", ret, dev_id);
> diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/librte_rawdev/rte_rawdev.c
> index bde33763e..6c4d783cc 100644
> --- a/lib/librte_rawdev/rte_rawdev.c
> +++ b/lib/librte_rawdev/rte_rawdev.c
> @@ -104,7 +104,8 @@ rte_rawdev_info_get(uint16_t dev_id, struct
> rte_rawdev_info *dev_info,  }
> 
>  int
> -rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf)
> +rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
> +		size_t dev_private_size)
>  {
>  	struct rte_rawdev *dev;
>  	int diag;
> @@ -123,7 +124,8 @@ rte_rawdev_configure(uint16_t dev_id, struct
> rte_rawdev_info *dev_conf)
>  	}
> 
>  	/* Configure the device */
> -	diag = (*dev->dev_ops->dev_configure)(dev, dev_conf-
> >dev_private);
> +	diag = (*dev->dev_ops->dev_configure)(dev, dev_conf-
> >dev_private,
> +			dev_private_size);
>  	if (diag != 0)
>  		RTE_RDEV_ERR("dev%d dev_configure = %d", dev_id, diag);
>  	else
> diff --git a/lib/librte_rawdev/rte_rawdev.h
> b/lib/librte_rawdev/rte_rawdev.h index cf6acfd26..73e3bd5ae 100644
> --- a/lib/librte_rawdev/rte_rawdev.h
> +++ b/lib/librte_rawdev/rte_rawdev.h
> @@ -116,13 +116,19 @@ rte_rawdev_info_get(uint16_t dev_id, struct
> rte_rawdev_info *dev_info,
>   *   driver/implementation can use to configure the device. It is also assumed
>   *   that once the configuration is done, a `queue_id` type field can be used
>   *   to refer to some arbitrary internal representation of a queue.
> + * @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
> + *   used by the driver, and may be checked by drivers to ensure the
> expected
> + *   struct type is provided.
>   *
>   * @return
>   *   - 0: Success, device configured.
>   *   - <0: Error code returned by the driver configuration function.
>   */
>  int
> -rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf);
> +rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
> +		size_t dev_private_size);
> 
> 
>  /**
> diff --git a/lib/librte_rawdev/rte_rawdev_pmd.h
> b/lib/librte_rawdev/rte_rawdev_pmd.h
> index 89e46412a..050f8b029 100644
> --- a/lib/librte_rawdev/rte_rawdev_pmd.h
> +++ b/lib/librte_rawdev/rte_rawdev_pmd.h
> @@ -160,7 +160,8 @@ typedef int (*rawdev_info_get_t)(struct rte_rawdev
> *dev,
>   *   Returns 0 on success
>   */
>  typedef int (*rawdev_configure_t)(const struct rte_rawdev *dev,
> -				  rte_rawdev_obj_t config);
> +				  rte_rawdev_obj_t config,
> +				  size_t config_size);
> 
>  /**
>   * Start a configured device.
> --
> 2.25.1
  

Patch

diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c
index 32a2b96c9..a50173264 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.c
+++ b/drivers/raw/ifpga/ifpga_rawdev.c
@@ -684,7 +684,8 @@  ifpga_rawdev_info_get(struct rte_rawdev *dev,
 
 static int
 ifpga_rawdev_configure(const struct rte_rawdev *dev,
-		rte_rawdev_obj_t config)
+		rte_rawdev_obj_t config,
+		size_t config_size __rte_unused)
 {
 	IFPGA_RAWDEV_PMD_FUNC_TRACE();
 
diff --git a/drivers/raw/ioat/ioat_rawdev.c b/drivers/raw/ioat/ioat_rawdev.c
index 6a336795d..b29ff983f 100644
--- a/drivers/raw/ioat/ioat_rawdev.c
+++ b/drivers/raw/ioat/ioat_rawdev.c
@@ -41,7 +41,8 @@  RTE_LOG_REGISTER(ioat_pmd_logtype, rawdev.ioat, INFO);
 #define COMPLETION_SZ sizeof(__m128i)
 
 static int
-ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+		size_t config_size)
 {
 	struct rte_ioat_rawdev_config *params = config;
 	struct rte_ioat_rawdev *ioat = dev->dev_private;
@@ -51,7 +52,7 @@  ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
 	if (dev->started)
 		return -EBUSY;
 
-	if (params == NULL)
+	if (params == NULL || config_size != sizeof(*params))
 		return -EINVAL;
 
 	if (params->ring_size > 4096 || params->ring_size < 64 ||
diff --git a/drivers/raw/ioat/ioat_rawdev_test.c b/drivers/raw/ioat/ioat_rawdev_test.c
index 90f5974cd..e5b50ae9f 100644
--- a/drivers/raw/ioat/ioat_rawdev_test.c
+++ b/drivers/raw/ioat/ioat_rawdev_test.c
@@ -165,7 +165,7 @@  ioat_rawdev_test(uint16_t dev_id)
 	}
 
 	p.ring_size = IOAT_TEST_RINGSIZE;
-	if (rte_rawdev_configure(dev_id, &info) != 0) {
+	if (rte_rawdev_configure(dev_id, &info, sizeof(p)) != 0) {
 		printf("Error with rte_rawdev_configure()\n");
 		return -1;
 	}
diff --git a/drivers/raw/ntb/ntb.c b/drivers/raw/ntb/ntb.c
index eaeb67b74..c181094d5 100644
--- a/drivers/raw/ntb/ntb.c
+++ b/drivers/raw/ntb/ntb.c
@@ -837,13 +837,17 @@  ntb_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info,
 }
 
 static int
-ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+		size_t config_size)
 {
 	struct ntb_dev_config *conf = config;
 	struct ntb_hw *hw = dev->dev_private;
 	uint32_t xstats_num;
 	int ret;
 
+	if (conf == NULL || config_size != sizeof(*conf))
+		return -EINVAL;
+
 	hw->queue_pairs	= conf->num_queues;
 	hw->queue_size = conf->queue_size;
 	hw->used_mw_num = conf->mz_num;
diff --git a/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c b/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
index e398abb75..5b496446c 100644
--- a/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
+++ b/drivers/raw/octeontx2_dma/otx2_dpi_rawdev.c
@@ -294,7 +294,8 @@  otx2_dpi_rawdev_reset(struct rte_rawdev *dev)
 }
 
 static int
-otx2_dpi_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+otx2_dpi_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+		size_t config_size)
 {
 	struct dpi_rawdev_conf_s *conf = config;
 	struct dpi_vf_s *dpivf = NULL;
@@ -302,8 +303,8 @@  otx2_dpi_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
 	uintptr_t pool;
 	uint32_t gaura;
 
-	if (conf == NULL) {
-		otx2_dpi_dbg("NULL configuration");
+	if (conf == NULL || config_size != sizeof(*conf)) {
+		otx2_dpi_dbg("NULL or invalid configuration");
 		return -EINVAL;
 	}
 	dpivf = (struct dpi_vf_s *)dev->dev_private;
diff --git a/drivers/raw/octeontx2_dma/otx2_dpi_test.c b/drivers/raw/octeontx2_dma/otx2_dpi_test.c
index 276658af0..cec6ca91b 100644
--- a/drivers/raw/octeontx2_dma/otx2_dpi_test.c
+++ b/drivers/raw/octeontx2_dma/otx2_dpi_test.c
@@ -182,7 +182,8 @@  test_otx2_dma_rawdev(uint16_t val)
 	/* Configure rawdev ports */
 	conf.chunk_pool = dpi_create_mempool();
 	rdev_info.dev_private = &conf;
-	ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info);
+	ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info,
+			sizeof(conf));
 	if (ret) {
 		otx2_dpi_dbg("Unable to configure DPIVF %d", i);
 		return -ENODEV;
diff --git a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
index 0778603d5..2b78a7941 100644
--- a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
+++ b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c
@@ -224,13 +224,14 @@  sdp_rawdev_close(struct rte_rawdev *dev)
 }
 
 static int
-sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+		size_t config_size)
 {
 	struct sdp_rawdev_info *app_info = (struct sdp_rawdev_info *)config;
 	struct sdp_device *sdpvf;
 
-	if (app_info == NULL) {
-		otx2_err("Application config info [NULL]");
+	if (app_info == NULL || config_size != sizeof(*app_info)) {
+		otx2_err("Application config info [NULL] or incorrect size");
 		return -EINVAL;
 	}
 
diff --git a/drivers/raw/octeontx2_ep/otx2_ep_test.c b/drivers/raw/octeontx2_ep/otx2_ep_test.c
index 091f1827c..b876275f7 100644
--- a/drivers/raw/octeontx2_ep/otx2_ep_test.c
+++ b/drivers/raw/octeontx2_ep/otx2_ep_test.c
@@ -108,7 +108,7 @@  sdp_rawdev_selftest(uint16_t dev_id)
 
 	dev_info.dev_private = &app_info;
 
-	ret = rte_rawdev_configure(dev_id, &dev_info);
+	ret = rte_rawdev_configure(dev_id, &dev_info, sizeof(app_info));
 	if (ret) {
 		otx2_err("Unable to configure SDP_VF %d", dev_id);
 		rte_mempool_free(ioq_mpool);
diff --git a/drivers/raw/skeleton/skeleton_rawdev.c b/drivers/raw/skeleton/skeleton_rawdev.c
index dce300c35..531d0450c 100644
--- a/drivers/raw/skeleton/skeleton_rawdev.c
+++ b/drivers/raw/skeleton/skeleton_rawdev.c
@@ -68,7 +68,8 @@  static int skeleton_rawdev_info_get(struct rte_rawdev *dev,
 }
 
 static int skeleton_rawdev_configure(const struct rte_rawdev *dev,
-				     rte_rawdev_obj_t config)
+				     rte_rawdev_obj_t config,
+				     size_t config_size)
 {
 	struct skeleton_rawdev *skeldev;
 	struct skeleton_rawdev_conf *skeldev_conf;
@@ -77,7 +78,7 @@  static int skeleton_rawdev_configure(const struct rte_rawdev *dev,
 
 	RTE_FUNC_PTR_OR_ERR_RET(dev, -EINVAL);
 
-	if (!config) {
+	if (config == NULL || config_size != sizeof(*skeldev_conf)) {
 		SKELETON_PMD_ERR("Invalid configuration");
 		return -EINVAL;
 	}
diff --git a/drivers/raw/skeleton/skeleton_rawdev_test.c b/drivers/raw/skeleton/skeleton_rawdev_test.c
index 9b8390dfb..7dc7c7684 100644
--- a/drivers/raw/skeleton/skeleton_rawdev_test.c
+++ b/drivers/raw/skeleton/skeleton_rawdev_test.c
@@ -126,7 +126,7 @@  test_rawdev_configure(void)
 	struct skeleton_rawdev_conf rdev_conf_get = {0};
 
 	/* Check invalid configuration */
-	ret = rte_rawdev_configure(test_dev_id, NULL);
+	ret = rte_rawdev_configure(test_dev_id, NULL, 0);
 	RTE_TEST_ASSERT(ret == -EINVAL,
 			"Null configure; Expected -EINVAL, got %d", ret);
 
@@ -137,7 +137,8 @@  test_rawdev_configure(void)
 
 	rdev_info.dev_private = &rdev_conf_set;
 	ret = rte_rawdev_configure(test_dev_id,
-				   (rte_rawdev_obj_t)&rdev_info);
+				   (rte_rawdev_obj_t)&rdev_info,
+				   sizeof(rdev_conf_set));
 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure rawdev (%d)", ret);
 
 	rdev_info.dev_private = &rdev_conf_get;
diff --git a/examples/ioat/ioatfwd.c b/examples/ioat/ioatfwd.c
index 5c631da1b..8e9513e44 100644
--- a/examples/ioat/ioatfwd.c
+++ b/examples/ioat/ioatfwd.c
@@ -734,7 +734,7 @@  configure_rawdev_queue(uint32_t dev_id)
 	struct rte_ioat_rawdev_config dev_config = { .ring_size = ring_size };
 	struct rte_rawdev_info info = { .dev_private = &dev_config };
 
-	if (rte_rawdev_configure(dev_id, &info) != 0) {
+	if (rte_rawdev_configure(dev_id, &info, sizeof(dev_config)) != 0) {
 		rte_exit(EXIT_FAILURE,
 			"Error with rte_rawdev_configure()\n");
 	}
diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c
index 11e224451..656f73659 100644
--- a/examples/ntb/ntb_fwd.c
+++ b/examples/ntb/ntb_fwd.c
@@ -1401,7 +1401,7 @@  main(int argc, char **argv)
 	ntb_conf.num_queues = num_queues;
 	ntb_conf.queue_size = nb_desc;
 	ntb_rawdev_conf.dev_private = (rte_rawdev_obj_t)(&ntb_conf);
-	ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf);
+	ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf, sizeof(ntb_conf));
 	if (ret)
 		rte_exit(EXIT_FAILURE, "Can't config ntb dev: err=%d, "
 			"port=%u\n", ret, dev_id);
diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/librte_rawdev/rte_rawdev.c
index bde33763e..6c4d783cc 100644
--- a/lib/librte_rawdev/rte_rawdev.c
+++ b/lib/librte_rawdev/rte_rawdev.c
@@ -104,7 +104,8 @@  rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
 }
 
 int
-rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf)
+rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
+		size_t dev_private_size)
 {
 	struct rte_rawdev *dev;
 	int diag;
@@ -123,7 +124,8 @@  rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf)
 	}
 
 	/* Configure the device */
-	diag = (*dev->dev_ops->dev_configure)(dev, dev_conf->dev_private);
+	diag = (*dev->dev_ops->dev_configure)(dev, dev_conf->dev_private,
+			dev_private_size);
 	if (diag != 0)
 		RTE_RDEV_ERR("dev%d dev_configure = %d", dev_id, diag);
 	else
diff --git a/lib/librte_rawdev/rte_rawdev.h b/lib/librte_rawdev/rte_rawdev.h
index cf6acfd26..73e3bd5ae 100644
--- a/lib/librte_rawdev/rte_rawdev.h
+++ b/lib/librte_rawdev/rte_rawdev.h
@@ -116,13 +116,19 @@  rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
  *   driver/implementation can use to configure the device. It is also assumed
  *   that once the configuration is done, a `queue_id` type field can be used
  *   to refer to some arbitrary internal representation of a queue.
+ * @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
+ *   used by the driver, and may be checked by drivers to ensure the expected
+ *   struct type is provided.
  *
  * @return
  *   - 0: Success, device configured.
  *   - <0: Error code returned by the driver configuration function.
  */
 int
-rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf);
+rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
+		size_t dev_private_size);
 
 
 /**
diff --git a/lib/librte_rawdev/rte_rawdev_pmd.h b/lib/librte_rawdev/rte_rawdev_pmd.h
index 89e46412a..050f8b029 100644
--- a/lib/librte_rawdev/rte_rawdev_pmd.h
+++ b/lib/librte_rawdev/rte_rawdev_pmd.h
@@ -160,7 +160,8 @@  typedef int (*rawdev_info_get_t)(struct rte_rawdev *dev,
  *   Returns 0 on success
  */
 typedef int (*rawdev_configure_t)(const struct rte_rawdev *dev,
-				  rte_rawdev_obj_t config);
+				  rte_rawdev_obj_t config,
+				  size_t config_size);
 
 /**
  * Start a configured device.