]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/drivers/net/tap/tap_intr.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2018 Mellanox Technologies, Ltd
7 * Interrupts handling for tap driver.
18 #include <rte_eth_tap.h>
19 #include <rte_errno.h>
20 #include <rte_interrupts.h>
24 * Unregister Rx interrupts free the queue interrupt vector.
27 * Pointer to the tap rte_eth_dev structure.
30 tap_rx_intr_vec_uninstall(struct rte_eth_dev
*dev
)
32 struct pmd_internals
*pmd
= dev
->data
->dev_private
;
33 struct rte_intr_handle
*intr_handle
= &pmd
->intr_handle
;
35 rte_intr_free_epoll_fd(intr_handle
);
36 free(intr_handle
->intr_vec
);
37 intr_handle
->intr_vec
= NULL
;
38 intr_handle
->nb_efd
= 0;
42 * Allocate Rx queue interrupt vector and register Rx interrupts.
45 * Pointer to the tap rte_eth_dev device structure.
48 * 0 on success, negative errno value otherwise and rte_errno is set.
51 tap_rx_intr_vec_install(struct rte_eth_dev
*dev
)
53 struct pmd_internals
*pmd
= dev
->data
->dev_private
;
54 struct pmd_process_private
*process_private
= dev
->process_private
;
55 unsigned int rxqs_n
= pmd
->dev
->data
->nb_rx_queues
;
56 struct rte_intr_handle
*intr_handle
= &pmd
->intr_handle
;
57 unsigned int n
= RTE_MIN(rxqs_n
, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID
);
59 unsigned int count
= 0;
61 if (!dev
->data
->dev_conf
.intr_conf
.rxq
)
63 intr_handle
->intr_vec
= malloc(sizeof(intr_handle
->intr_vec
[rxqs_n
]));
64 if (intr_handle
->intr_vec
== NULL
) {
67 "failed to allocate memory for interrupt vector,"
68 " Rx interrupts will not be supported");
71 for (i
= 0; i
< n
; i
++) {
72 struct rx_queue
*rxq
= pmd
->dev
->data
->rx_queues
[i
];
74 /* Skip queues that cannot request interrupts. */
75 if (!rxq
|| process_private
->rxq_fds
[i
] <= 0) {
76 /* Use invalid intr_vec[] index to disable entry. */
77 intr_handle
->intr_vec
[i
] =
78 RTE_INTR_VEC_RXTX_OFFSET
+
79 RTE_MAX_RXTX_INTR_VEC_ID
;
82 intr_handle
->intr_vec
[i
] = RTE_INTR_VEC_RXTX_OFFSET
+ count
;
83 intr_handle
->efds
[count
] = process_private
->rxq_fds
[i
];
87 tap_rx_intr_vec_uninstall(dev
);
89 intr_handle
->nb_efd
= count
;
94 * Register or unregister the Rx interrupts.
97 * Pointer to the tap rte_eth_dev device structure.
99 * should the operation be register or unregister the interrupts.
102 * 0 on success, negative errno value otherwise and rte_errno is set.
105 tap_rx_intr_vec_set(struct rte_eth_dev
*dev
, int set
)
107 tap_rx_intr_vec_uninstall(dev
);
109 return tap_rx_intr_vec_install(dev
);