[dpdk-dev,v4,07/13] eal: add intr api to report multi-vector capability
Commit Message
VFIO allows multiple MSI-X vector, others doesn't, but maybe will allow it in the future.
Device drivers need to be aware of the capability.
It's better to avoid condition check on interrupt type(VFIO) everywhere, instead
a capability api is more flexible for the condition change.
v3 change:
- add new api dummy in bsdapp
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
lib/librte_eal/bsdapp/eal/eal_interrupts.c | 7 +++++++
lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h | 10 ++++++++++
lib/librte_eal/bsdapp/eal/rte_eal_version.map | 7 +++++++
lib/librte_eal/linuxapp/eal/eal_interrupts.c | 9 +++++++++
lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h | 10 ++++++++++
lib/librte_eal/linuxapp/eal/rte_eal_version.map | 7 +++++++
6 files changed, 50 insertions(+)
\ No newline at end of file
Comments
On Wed, Nov 4, 2015 at 9:45 AM, Cunming Liang <cunming.liang@intel.com>
wrote:
> VFIO allows multiple MSI-X vector, others doesn't, but maybe will allow it
> in the future.
> Device drivers need to be aware of the capability.
> It's better to avoid condition check on interrupt type(VFIO) everywhere,
> instead
> a capability api is more flexible for the condition change.
>
> v3 change:
> - add new api dummy in bsdapp
>
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
>
Acked-by: David Marchand <david.marchand@6wind.com>
@@ -110,3 +110,10 @@ rte_intr_allow_others(struct rte_intr_handle *intr_handle)
RTE_SET_USED(intr_handle);
return 1;
}
+
+int
+rte_intr_cap_multiple(struct rte_intr_handle *intr_handle)
+{
+ RTE_SET_USED(intr_handle);
+ return 0;
+}
@@ -122,4 +122,14 @@ int rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
*/
int rte_intr_allow_others(struct rte_intr_handle *intr_handle);
+/**
+ * The multiple interrupt vector capability of interrupt handle instance.
+ * It returns zero if no multiple interrupt vector support.
+ *
+ * @param intr_handle
+ * Pointer to the interrupt handle.
+ */
+int
+rte_intr_cap_multiple(struct rte_intr_handle *intr_handle);
+
#endif /* _RTE_BSDAPP_INTERRUPTS_H_ */
@@ -125,3 +125,10 @@ DPDK_2.1 {
rte_memzone_free;
} DPDK_2.0;
+
+DPDK_2.2 {
+ global:
+
+ rte_intr_cap_multiple;
+
+} DPDK_2.1;
\ No newline at end of file
@@ -1212,3 +1212,12 @@ rte_intr_allow_others(struct rte_intr_handle *intr_handle)
else
return !!(intr_handle->max_intr - intr_handle->nb_efd);
}
+
+int
+rte_intr_cap_multiple(struct rte_intr_handle *intr_handle)
+{
+ if (intr_handle->type == RTE_INTR_HANDLE_VFIO_MSIX)
+ return 1;
+
+ return 0;
+}
@@ -215,4 +215,14 @@ rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
int
rte_intr_allow_others(struct rte_intr_handle *intr_handle);
+/**
+ * The multiple interrupt vector capability of interrupt handle instance.
+ * It returns zero if no multiple interrupt vector support.
+ *
+ * @param intr_handle
+ * Pointer to the interrupt handle.
+ */
+int
+rte_intr_cap_multiple(struct rte_intr_handle *intr_handle);
+
#endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
@@ -128,3 +128,10 @@ DPDK_2.1 {
rte_memzone_free;
} DPDK_2.0;
+
+DPDK_2.2 {
+ global:
+
+ rte_intr_cap_multiple;
+
+} DPDK_2.1;