DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd
@ 2018-09-28  3:43 Xiaoyun Li
  2018-09-28  8:33 ` Ferruh Yigit
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Xiaoyun Li @ 2018-09-28  3:43 UTC (permalink / raw)
  To: ferruh.yigit, thomas, helin.zhang, damarion, ray.kinsella, dev; +Cc: Xiaoyun Li

Some users want to use their own epoll instances to control both
DPDK rxq interrupt fds and their own other fds. So added a function
to get rxq interrupt fd based on port id and queue id.

Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
---
 lib/librte_ethdev/rte_ethdev.c | 37 ++++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h |  3 +++
 2 files changed, 40 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index ef99f7068..c21124e32 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -3433,6 +3433,43 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 	return 0;
 }
 
+int
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+				 int *fd)
+{
+	struct rte_intr_handle *intr_handle;
+	struct rte_eth_dev *dev;
+	unsigned int efd_idx;
+	uint32_t vec;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+	dev = &rte_eth_devices[port_id];
+
+	if (queue_id >= dev->data->nb_rx_queues) {
+		RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	if (!dev->intr_handle) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr handle unset\n");
+		return -ENOTSUP;
+	}
+
+	intr_handle = dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	vec = intr_handle->intr_vec[queue_id];
+	efd_idx = (vec >= RTE_INTR_VEC_RXTX_OFFSET) ?
+		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
+	*fd = intr_handle->efds[efd_idx];
+
+	return 0;
+}
+
 const struct rte_memzone *
 rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 			 uint16_t queue_id, size_t size, unsigned align,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 012577b0a..3670d7249 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -2719,6 +2719,9 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
+int rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+				     int *fd);
+
 /**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
-- 
2.17.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd
  2018-09-28  3:43 [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd Xiaoyun Li
@ 2018-09-28  8:33 ` Ferruh Yigit
  2018-09-28  9:08   ` Li, Xiaoyun
  2018-09-28 10:05 ` [dpdk-dev] [PATCH v2] " Xiaoyun Li
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Ferruh Yigit @ 2018-09-28  8:33 UTC (permalink / raw)
  To: Xiaoyun Li, thomas, helin.zhang, damarion, ray.kinsella, dev

On 9/28/2018 4:43 AM, Xiaoyun Li wrote:
> Some users want to use their own epoll instances to control both
> DPDK rxq interrupt fds and their own other fds. So added a function
> to get rxq interrupt fd based on port id and queue id.
> 
> Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>

<...>

> @@ -2719,6 +2719,9 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
>  int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
>  			      int epfd, int op, void *data);
>  
> +int rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
> +				     int *fd);


Hi Xiaoyun,

API is missing documentation, please add doxygen comments.

New APIs need to be experimental, at least for one release.
Also can you please add it to .map file otherwise shared lib build will fail

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd
  2018-09-28  8:33 ` Ferruh Yigit
@ 2018-09-28  9:08   ` Li, Xiaoyun
  0 siblings, 0 replies; 9+ messages in thread
From: Li, Xiaoyun @ 2018-09-28  9:08 UTC (permalink / raw)
  To: Yigit, Ferruh, thomas, Zhang, Helin, damarion, Kinsella, Ray, dev

OK. Thanks.

> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Friday, September 28, 2018 16:33
> To: Li, Xiaoyun <xiaoyun.li@intel.com>; thomas@monjalon.net; Zhang, Helin
> <helin.zhang@intel.com>; damarion@cisco.com; Kinsella, Ray
> <ray.kinsella@intel.com>; dev@dpdk.org
> Subject: Re: [PATCH] ethdev: get rxq interrupt fd
> 
> On 9/28/2018 4:43 AM, Xiaoyun Li wrote:
> > Some users want to use their own epoll instances to control both DPDK
> > rxq interrupt fds and their own other fds. So added a function to get
> > rxq interrupt fd based on port id and queue id.
> >
> > Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
> 
> <...>
> 
> > @@ -2719,6 +2719,9 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id,
> > int epfd, int op, void *data);  int rte_eth_dev_rx_intr_ctl_q(uint16_t
> port_id, uint16_t queue_id,
> >  			      int epfd, int op, void *data);
> >
> > +int rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t
> queue_id,
> > +				     int *fd);
> 
> 
> Hi Xiaoyun,
> 
> API is missing documentation, please add doxygen comments.
> 
> New APIs need to be experimental, at least for one release.
> Also can you please add it to .map file otherwise shared lib build will fail


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [dpdk-dev] [PATCH v2] ethdev: get rxq interrupt fd
  2018-09-28  3:43 [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd Xiaoyun Li
  2018-09-28  8:33 ` Ferruh Yigit
@ 2018-09-28 10:05 ` Xiaoyun Li
  2018-09-28 12:46 ` [dpdk-dev] [PATCH] " Stephen Hemminger
  2018-09-29  2:12 ` [dpdk-dev] [PATCH v3] " Xiaoyun Li
  3 siblings, 0 replies; 9+ messages in thread
From: Xiaoyun Li @ 2018-09-28 10:05 UTC (permalink / raw)
  To: ferruh.yigit, thomas, damarion; +Cc: helin.zhang, ray.kinsella, dev, Xiaoyun Li

Some users want to use their own epoll instances to control both
DPDK rxq interrupt fds and their own other fds. So added a function
to get rxq interrupt fd based on port id and queue id.

Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
---
v2:
 * Added missing API doxygen comments.
 * Set the new API to be experimental and added it in .map file.
---
 lib/librte_ethdev/rte_ethdev.c           | 37 ++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h           | 22 ++++++++++++++
 lib/librte_ethdev/rte_ethdev_version.map |  1 +
 3 files changed, 60 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index ef99f7068..7c580ec68 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -3433,6 +3433,43 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 	return 0;
 }
 
+int __rte_experimental
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+				 int *fd)
+{
+	struct rte_intr_handle *intr_handle;
+	struct rte_eth_dev *dev;
+	unsigned int efd_idx;
+	uint32_t vec;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+	dev = &rte_eth_devices[port_id];
+
+	if (queue_id >= dev->data->nb_rx_queues) {
+		RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	if (!dev->intr_handle) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr handle unset\n");
+		return -ENOTSUP;
+	}
+
+	intr_handle = dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	vec = intr_handle->intr_vec[queue_id];
+	efd_idx = (vec >= RTE_INTR_VEC_RXTX_OFFSET) ?
+		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
+	*fd = intr_handle->efds[efd_idx];
+
+	return 0;
+}
+
 const struct rte_memzone *
 rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 			 uint16_t queue_id, size_t size, unsigned align,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 012577b0a..8f6a5d08b 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -2719,6 +2719,28 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get interrupt fd per Rx queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param fd
+ *   The interrupt fd which the requested Rx queue associated to.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int __rte_experimental
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+				 int *fd);
+
 /**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map
index 38f117f01..c98f9fa4a 100644
--- a/lib/librte_ethdev/rte_ethdev_version.map
+++ b/lib/librte_ethdev/rte_ethdev_version.map
@@ -235,6 +235,7 @@ EXPERIMENTAL {
 	rte_eth_dev_owner_new;
 	rte_eth_dev_owner_set;
 	rte_eth_dev_owner_unset;
+	rte_eth_dev_rx_intr_ctl_q_get_fd;
 	rte_eth_dev_rx_offload_name;
 	rte_eth_dev_tx_offload_name;
 	rte_eth_switch_domain_alloc;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd
  2018-09-28  3:43 [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd Xiaoyun Li
  2018-09-28  8:33 ` Ferruh Yigit
  2018-09-28 10:05 ` [dpdk-dev] [PATCH v2] " Xiaoyun Li
@ 2018-09-28 12:46 ` Stephen Hemminger
  2018-09-29  1:57   ` Li, Xiaoyun
  2018-09-29  2:12 ` [dpdk-dev] [PATCH v3] " Xiaoyun Li
  3 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2018-09-28 12:46 UTC (permalink / raw)
  To: Li, Xiaoyun
  Cc: Ferruh Yigit, Thomas Monjalon, helin.zhang, damarion, ray.kinsella, dev

In general, an API is less error prone if it only does return by value.
What about just returning fd or -1?


On Fri, Sep 28, 2018, 5:55 AM Xiaoyun Li <xiaoyun.li@intel.com> wrote:

> Some users want to use their own epoll instances to control both
> DPDK rxq interrupt fds and their own other fds. So added a function
> to get rxq interrupt fd based on port id and queue id.
>
> Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
> ---
>  lib/librte_ethdev/rte_ethdev.c | 37 ++++++++++++++++++++++++++++++++++
>  lib/librte_ethdev/rte_ethdev.h |  3 +++
>  2 files changed, 40 insertions(+)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.c
> b/lib/librte_ethdev/rte_ethdev.c
> index ef99f7068..c21124e32 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -3433,6 +3433,43 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd,
> int op, void *data)
>         return 0;
>  }
>
> +int
> +rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
> +                                int *fd)
> +{
> +       struct rte_intr_handle *intr_handle;
> +       struct rte_eth_dev *dev;
> +       unsigned int efd_idx;
> +       uint32_t vec;
> +
> +       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +
> +       dev = &rte_eth_devices[port_id];
> +
> +       if (queue_id >= dev->data->nb_rx_queues) {
> +               RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
> +               return -EINVAL;
> +       }
> +
> +       if (!dev->intr_handle) {
> +               RTE_ETHDEV_LOG(ERR, "RX Intr handle unset\n");
> +               return -ENOTSUP;
> +       }
> +
> +       intr_handle = dev->intr_handle;
> +       if (!intr_handle->intr_vec) {
> +               RTE_ETHDEV_LOG(ERR, "RX Intr vector unset\n");
> +               return -EPERM;
> +       }
> +
> +       vec = intr_handle->intr_vec[queue_id];
> +       efd_idx = (vec >= RTE_INTR_VEC_RXTX_OFFSET) ?
> +               (vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
> +       *fd = intr_handle->efds[efd_idx];
> +
> +       return 0;
> +}
> +
>  const struct rte_memzone *
>  rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char
> *ring_name,
>                          uint16_t queue_id, size_t size, unsigned align,
> diff --git a/lib/librte_ethdev/rte_ethdev.h
> b/lib/librte_ethdev/rte_ethdev.h
> index 012577b0a..3670d7249 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -2719,6 +2719,9 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int
> epfd, int op, void *data);
>  int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
>                               int epfd, int op, void *data);
>
> +int rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
> +                                    int *fd);
> +
>  /**
>   * Turn on the LED on the Ethernet device.
>   * This function turns on the LED on the Ethernet device.
> --
> 2.17.1
>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd
  2018-09-28 12:46 ` [dpdk-dev] [PATCH] " Stephen Hemminger
@ 2018-09-29  1:57   ` Li, Xiaoyun
  0 siblings, 0 replies; 9+ messages in thread
From: Li, Xiaoyun @ 2018-09-29  1:57 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Yigit, Ferruh, Thomas Monjalon, Zhang, Helin, damarion, Kinsella,
	Ray, dev

Sure. Anyway there is an error log to indicate the error.
I will send v3 later. Thanks.

From: Stephen Hemminger [mailto:stephen@networkplumber.org]
Sent: Friday, September 28, 2018 20:47
To: Li, Xiaoyun <xiaoyun.li@intel.com>
Cc: Yigit, Ferruh <ferruh.yigit@intel.com>; Thomas Monjalon <thomas@monjalon.net>; Zhang, Helin <helin.zhang@intel.com>; damarion@cisco.com; Kinsella, Ray <ray.kinsella@intel.com>; dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd

In general, an API is less error prone if it only does return by value. What about just returning fd or -1?


On Fri, Sep 28, 2018, 5:55 AM Xiaoyun Li <xiaoyun.li@intel.com<mailto:xiaoyun.li@intel.com>> wrote:
Some users want to use their own epoll instances to control both
DPDK rxq interrupt fds and their own other fds. So added a function
to get rxq interrupt fd based on port id and queue id.

Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com<mailto:xiaoyun.li@intel.com>>
---
 lib/librte_ethdev/rte_ethdev.c | 37 ++++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h |  3 +++
 2 files changed, 40 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index ef99f7068..c21124e32 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -3433,6 +3433,43 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
        return 0;
 }

+int
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+                                int *fd)
+{
+       struct rte_intr_handle *intr_handle;
+       struct rte_eth_dev *dev;
+       unsigned int efd_idx;
+       uint32_t vec;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       dev = &rte_eth_devices[port_id];
+
+       if (queue_id >= dev->data->nb_rx_queues) {
+               RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
+               return -EINVAL;
+       }
+
+       if (!dev->intr_handle) {
+               RTE_ETHDEV_LOG(ERR, "RX Intr handle unset\n");
+               return -ENOTSUP;
+       }
+
+       intr_handle = dev->intr_handle;
+       if (!intr_handle->intr_vec) {
+               RTE_ETHDEV_LOG(ERR, "RX Intr vector unset\n");
+               return -EPERM;
+       }
+
+       vec = intr_handle->intr_vec[queue_id];
+       efd_idx = (vec >= RTE_INTR_VEC_RXTX_OFFSET) ?
+               (vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
+       *fd = intr_handle->efds[efd_idx];
+
+       return 0;
+}
+
 const struct rte_memzone *
 rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
                         uint16_t queue_id, size_t size, unsigned align,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 012577b0a..3670d7249 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -2719,6 +2719,9 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
                              int epfd, int op, void *data);

+int rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id,
+                                    int *fd);
+
 /**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
--
2.17.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [dpdk-dev] [PATCH v3] ethdev: get rxq interrupt fd
  2018-09-28  3:43 [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd Xiaoyun Li
                   ` (2 preceding siblings ...)
  2018-09-28 12:46 ` [dpdk-dev] [PATCH] " Stephen Hemminger
@ 2018-09-29  2:12 ` Xiaoyun Li
  2018-10-02 10:48   ` Ferruh Yigit
  3 siblings, 1 reply; 9+ messages in thread
From: Xiaoyun Li @ 2018-09-29  2:12 UTC (permalink / raw)
  To: ferruh.yigit, thomas, damarion, stephen
  Cc: helin.zhang, ray.kinsella, dev, Xiaoyun Li

Some users want to use their own epoll instances to control both
DPDK rxq interrupt fds and their own other fds. So added a function
to get rxq interrupt fd based on port id and queue id.

Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
---
v3:
 * Since the API only wants to return fd, return fd or -1.
v2:
 * Added missing API doxygen comments.
 * Set the new API to be experimental and added it in .map file.
---
 lib/librte_ethdev/rte_ethdev.c           | 37 ++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h           | 20 +++++++++++++
 lib/librte_ethdev/rte_ethdev_version.map |  1 +
 3 files changed, 58 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index ef99f7068..4930eb6ff 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -3433,6 +3433,43 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 	return 0;
 }
 
+int __rte_experimental
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id)
+{
+	struct rte_intr_handle *intr_handle;
+	struct rte_eth_dev *dev;
+	unsigned int efd_idx;
+	uint32_t vec;
+	int fd;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
+
+	dev = &rte_eth_devices[port_id];
+
+	if (queue_id >= dev->data->nb_rx_queues) {
+		RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
+		return -1;
+	}
+
+	if (!dev->intr_handle) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr handle unset\n");
+		return -1;
+	}
+
+	intr_handle = dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		RTE_ETHDEV_LOG(ERR, "RX Intr vector unset\n");
+		return -1;
+	}
+
+	vec = intr_handle->intr_vec[queue_id];
+	efd_idx = (vec >= RTE_INTR_VEC_RXTX_OFFSET) ?
+		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
+	fd = intr_handle->efds[efd_idx];
+
+	return fd;
+}
+
 const struct rte_memzone *
 rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 			 uint16_t queue_id, size_t size, unsigned align,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 012577b0a..f9366f3f0 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -2719,6 +2719,26 @@ int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get interrupt fd per Rx queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - (>=0) the interrupt fd associated to the requested Rx queue if
+ *           successful.
+ *   - (-1) on error.
+ */
+int __rte_experimental
+rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id);
+
 /**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map
index 38f117f01..c98f9fa4a 100644
--- a/lib/librte_ethdev/rte_ethdev_version.map
+++ b/lib/librte_ethdev/rte_ethdev_version.map
@@ -235,6 +235,7 @@ EXPERIMENTAL {
 	rte_eth_dev_owner_new;
 	rte_eth_dev_owner_set;
 	rte_eth_dev_owner_unset;
+	rte_eth_dev_rx_intr_ctl_q_get_fd;
 	rte_eth_dev_rx_offload_name;
 	rte_eth_dev_tx_offload_name;
 	rte_eth_switch_domain_alloc;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH v3] ethdev: get rxq interrupt fd
  2018-09-29  2:12 ` [dpdk-dev] [PATCH v3] " Xiaoyun Li
@ 2018-10-02 10:48   ` Ferruh Yigit
  2018-10-04 15:31     ` Ferruh Yigit
  0 siblings, 1 reply; 9+ messages in thread
From: Ferruh Yigit @ 2018-10-02 10:48 UTC (permalink / raw)
  To: Xiaoyun Li, thomas, damarion, stephen; +Cc: helin.zhang, ray.kinsella, dev

On 9/29/2018 3:12 AM, Xiaoyun Li wrote:
> Some users want to use their own epoll instances to control both
> DPDK rxq interrupt fds and their own other fds. So added a function
> to get rxq interrupt fd based on port id and queue id.
> 
> Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>

Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH v3] ethdev: get rxq interrupt fd
  2018-10-02 10:48   ` Ferruh Yigit
@ 2018-10-04 15:31     ` Ferruh Yigit
  0 siblings, 0 replies; 9+ messages in thread
From: Ferruh Yigit @ 2018-10-04 15:31 UTC (permalink / raw)
  To: Xiaoyun Li, thomas, damarion, stephen; +Cc: helin.zhang, ray.kinsella, dev

On 10/2/2018 11:48 AM, Ferruh Yigit wrote:
> On 9/29/2018 3:12 AM, Xiaoyun Li wrote:
>> Some users want to use their own epoll instances to control both
>> DPDK rxq interrupt fds and their own other fds. So added a function
>> to get rxq interrupt fd based on port id and queue id.
>>
>> Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
> 
> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-10-04 15:31 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-28  3:43 [dpdk-dev] [PATCH] ethdev: get rxq interrupt fd Xiaoyun Li
2018-09-28  8:33 ` Ferruh Yigit
2018-09-28  9:08   ` Li, Xiaoyun
2018-09-28 10:05 ` [dpdk-dev] [PATCH v2] " Xiaoyun Li
2018-09-28 12:46 ` [dpdk-dev] [PATCH] " Stephen Hemminger
2018-09-29  1:57   ` Li, Xiaoyun
2018-09-29  2:12 ` [dpdk-dev] [PATCH v3] " Xiaoyun Li
2018-10-02 10:48   ` Ferruh Yigit
2018-10-04 15:31     ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).