[1/3] rawdev: allow calling info function for unknown rawdevs

Message ID 20200706103132.7691-2-bruce.richardson@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series Minor rawdev fixes and enhancements |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-testing success Testing PASS
ci/Intel-compilation success Compilation OK
ci/iol-mellanox-Performance success Performance Testing PASS

Commit Message

Bruce Richardson July 6, 2020, 10:31 a.m. UTC
  To call the rte_rawdev_info_get() function, the user currently has to know
the underlying type of the device in order to pass an appropriate structure
or buffer as the dev_private pointer in the info structure. By allowing a
NULL value for this field, we can skip getting the device-specific info and
just return the generic info - including the device name and driver, which
can be used to determine the device type - to the user.

This ensures that basic info can be get for all rawdevs, without knowing
the type, and even if the info driver API call has not been implemented for
the device.

Cc: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_rawdev/rte_rawdev.c | 6 ++++--
 lib/librte_rawdev/rte_rawdev.h | 8 +++++++-
 2 files changed, 11 insertions(+), 3 deletions(-)
  

Comments

Hemant Agrawal July 7, 2020, 3:40 a.m. UTC | #1
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
  
Thomas Monjalon July 7, 2020, 12:18 p.m. UTC | #2
06/07/2020 12:31, Bruce Richardson:
> To call the rte_rawdev_info_get() function, the user currently has to know
> the underlying type of the device in order to pass an appropriate structure
> or buffer as the dev_private pointer in the info structure. By allowing a
> NULL value for this field, we can skip getting the device-specific info and
> just return the generic info - including the device name and driver, which
> can be used to determine the device type - to the user.
> 
> This ensures that basic info can be get for all rawdevs, without knowing
> the type, and even if the info driver API call has not been implemented for
> the device.
> 
> Cc: stable@dpdk.org

This is a new feature. Why should it be backported?
  
Bruce Richardson July 7, 2020, 12:31 p.m. UTC | #3
On Tue, Jul 07, 2020 at 02:18:31PM +0200, Thomas Monjalon wrote:
> 06/07/2020 12:31, Bruce Richardson:
> > To call the rte_rawdev_info_get() function, the user currently has to
> > know the underlying type of the device in order to pass an appropriate
> > structure or buffer as the dev_private pointer in the info structure.
> > By allowing a NULL value for this field, we can skip getting the
> > device-specific info and just return the generic info - including the
> > device name and driver, which can be used to determine the device type
> > - to the user.
> > 
> > This ensures that basic info can be get for all rawdevs, without
> > knowing the type, and even if the info driver API call has not been
> > implemented for the device.
> > 
> > Cc: stable@dpdk.org
> 
> This is a new feature. Why should it be backported?
> 

I'd largely leave it up to the stable maintainers, but IMHO it should be
backported as its not a big change and I don't see the existing rawdev APIs
as very usable without it. I think the current API leaves the user in a bit
of a catch 22, since info_get() is the API you'd expect to call to find out
the actual type of a rawdev, but unfortunately, to call the info_get API
you need to know the type to pass in the appropriate type-specific
structure parameter. Therefore I see this as fixing a usability bug. :-)

Regards,
/Bruce
  

Patch

diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/librte_rawdev/rte_rawdev.c
index aec61f425..b18638435 100644
--- a/lib/librte_rawdev/rte_rawdev.c
+++ b/lib/librte_rawdev/rte_rawdev.c
@@ -90,8 +90,10 @@  rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info)
 
 	rawdev = &rte_rawdevs[dev_id];
 
-	RTE_FUNC_PTR_OR_ERR_RET(*rawdev->dev_ops->dev_info_get, -ENOTSUP);
-	(*rawdev->dev_ops->dev_info_get)(rawdev, dev_info->dev_private);
+	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);
+	}
 
 	if (dev_info) {
 
diff --git a/lib/librte_rawdev/rte_rawdev.h b/lib/librte_rawdev/rte_rawdev.h
index ed011ca22..7fb6cb188 100644
--- a/lib/librte_rawdev/rte_rawdev.h
+++ b/lib/librte_rawdev/rte_rawdev.h
@@ -77,7 +77,13 @@  struct rte_rawdev_info;
  *
  * @param[out] dev_info
  *   A pointer to a structure of type *rte_rawdev_info* to be filled with the
- *   contextual information of the device.
+ *   contextual information of the device. The dev_info->dev_private field
+ *   should point to an appropriate buffer space for holding the device-
+ *   specific info for that hardware.
+ *   If the dev_private field is set to NULL, then the device-specific info
+ *   function will not be called and only basic information about the device
+ *   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.
  *
  * @return
  *   - 0: Success, driver updates the contextual information of the raw device