Re: [PATCH 1/2] eal: clean up interrupt handle
From: Jan Blunck <hidden>
Date: 2017-02-27 16:19:13
On Wed, Feb 22, 2017 at 11:17 PM, Qi Zhang [off-list ref] wrote:
quoted hunk ↗ jump to hunk
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c@@ -278,29 +278,6 @@ vfio_disable_msi(const struct rte_intr_handle *intr_handle) { return ret; } -static int -get_max_intr(const struct rte_intr_handle *intr_handle) -{ - struct rte_intr_source *src; - - TAILQ_FOREACH(src, &intr_sources, next) { - if (src->intr_handle.fd != intr_handle->fd) - continue; - - if (src->intr_handle.max_intr < intr_handle->max_intr) - src->intr_handle.max_intr = intr_handle->max_intr; - if (!src->intr_handle.max_intr) - src->intr_handle.max_intr = 1; - else if (src->intr_handle.max_intr > RTE_MAX_RXTX_INTR_VEC_ID) - src->intr_handle.max_intr - = RTE_MAX_RXTX_INTR_VEC_ID + 1; - - return src->intr_handle.max_intr; - } - - return -1; -} - /* enable MSI-X interrupts */ static int vfio_enable_msix(const struct rte_intr_handle *intr_handle) {@@ -313,15 +290,10 @@ vfio_enable_msix(const struct rte_intr_handle *intr_handle) { irq_set = (struct vfio_irq_set *) irq_set_buf; irq_set->argsz = len; - - ret = get_max_intr(intr_handle); - if (ret < 0) { - RTE_LOG(ERR, EAL, "Invalid number of MSI-X irqs for fd %d\n", - intr_handle->fd); - return -1; - } - - irq_set->count = ret; + /* 0 < irq_set->count < RTE_MAX_RXTX_INTR_VEC_ID + 1 */ + irq_set->count = intr_handle->max_intr ? + (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID + 1 ? + RTE_MAX_RXTX_INTR_VEC_ID + 1 : intr_handle->max_intr) : 1; irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX; irq_set->start = 0;
The changes (to not change the interrupt handle in intr_sources) seems to be unrelated to the API changes. Can you split this into two commits, please? Also I'm not 100% convinced that the low-level drivers should make extensive use of the ethdev's const intr_handle. I believe that the ethdev ops might be incomplete in that sense that it would be better to add an rx_intr_ctl() operation to the ethdev ops structure and pass control the the low-level device.