]>
git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/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.
17 #include <rte_eth_tap.h>
18 #include <rte_errno.h>
19 #include <rte_interrupts.h>
23 * Unregister Rx interrupts free the queue interrupt vector.
26 * Pointer to the tap rte_eth_dev structure.
29 tap_rx_intr_vec_uninstall(struct rte_eth_dev
*dev
)
31 struct pmd_internals
*pmd
= dev
->data
->dev_private
;
32 struct rte_intr_handle
*intr_handle
= &pmd
->intr_handle
;
34 rte_intr_free_epoll_fd(intr_handle
);
35 free(intr_handle
->intr_vec
);
36 intr_handle
->intr_vec
= NULL
;
37 intr_handle
->nb_efd
= 0;
41 * Allocate Rx queue interrupt vector and register Rx interrupts.
44 * Pointer to the tap rte_eth_dev device structure.
47 * 0 on success, negative errno value otherwise and rte_errno is set.
50 tap_rx_intr_vec_install(struct rte_eth_dev
*dev
)
52 struct pmd_internals
*pmd
= dev
->data
->dev_private
;
53 struct pmd_process_private
*process_private
= dev
->process_private
;
54 unsigned int rxqs_n
= pmd
->dev
->data
->nb_rx_queues
;
55 struct rte_intr_handle
*intr_handle
= &pmd
->intr_handle
;
56 unsigned int n
= RTE_MIN(rxqs_n
, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID
);
58 unsigned int count
= 0;
60 if (!dev
->data
->dev_conf
.intr_conf
.rxq
)
62 intr_handle
->intr_vec
= malloc(sizeof(intr_handle
->intr_vec
[rxqs_n
]));
63 if (intr_handle
->intr_vec
== NULL
) {
66 "failed to allocate memory for interrupt vector,"
67 " Rx interrupts will not be supported");
70 for (i
= 0; i
< n
; i
++) {
71 struct rx_queue
*rxq
= pmd
->dev
->data
->rx_queues
[i
];
73 /* Skip queues that cannot request interrupts. */
74 if (!rxq
|| process_private
->rxq_fds
[i
] == -1) {
75 /* Use invalid intr_vec[] index to disable entry. */
76 intr_handle
->intr_vec
[i
] =
77 RTE_INTR_VEC_RXTX_OFFSET
+
78 RTE_MAX_RXTX_INTR_VEC_ID
;
81 intr_handle
->intr_vec
[i
] = RTE_INTR_VEC_RXTX_OFFSET
+ count
;
82 intr_handle
->efds
[count
] = process_private
->rxq_fds
[i
];
86 tap_rx_intr_vec_uninstall(dev
);
88 intr_handle
->nb_efd
= count
;
93 * Register or unregister the Rx interrupts.
96 * Pointer to the tap rte_eth_dev device structure.
98 * should the operation be register or unregister the interrupts.
101 * 0 on success, negative errno value otherwise and rte_errno is set.
104 tap_rx_intr_vec_set(struct rte_eth_dev
*dev
, int set
)
106 tap_rx_intr_vec_uninstall(dev
);
108 return tap_rx_intr_vec_install(dev
);