e1016cb733
This commit addresses various issues that may lead to undefined behavior
when configuring Rx interrupts.
While failure to create a Rx queue completion channel in rxq_ctrl_setup()
prevents that queue from being created, existing queues still have theirs.
Since the error handler disables dev_conf.intr_conf.rxq as well, subsequent
calls to rxq_ctrl_setup() create Rx queues without interrupts. This leads
to a scenario where not all Rx queues support interrupts; missing checks on
the presence of completion channels may crash the application.
Considering that the PMD is not supposed to disable user-provided
configuration parameters (dev_conf.intr_conf.rxq), and that these can
change for subsequent rxq_ctrl_setup() calls anyway, properly supporting a
mixed mode where not all Rx queues have interrupts enabled is a better
approach.
To do so with a minimum set of changes, priv_intr_efd_enable() and
priv_create_intr_vec() are first refactored as a single
priv_rx_intr_vec_enable() function (same for their "disable" counterparts).
Since they had to be used together, there was no point in keeping them
separate.
Remaining changes:
- Always clean up before reconfiguring interrupts to avoid memory leaks.
- Always clean up when closing the device.
- Use malloc()/free() instead of their rte_*() counterparts since there is
no need to store the vector in huge pages-backed memory.
- Allow more Rx queues than the size of the event file descriptor array as
long as Rx interrupts are not requested on all of them.
- Properly clean up interrupt handle when disabling Rx interrupts (nb_efd
and intr_vec reset to 0).
- Check completion channel presence while toggling Rx interrupts on a given
queue.
Fixes:
|
||
---|---|---|
.. | ||
af_packet | ||
ark | ||
avp | ||
bnx2x | ||
bnxt | ||
bonding | ||
cxgbe | ||
dpaa2 | ||
e1000 | ||
ena | ||
enic | ||
fm10k | ||
i40e | ||
ixgbe | ||
kni | ||
liquidio | ||
mlx4 | ||
mlx5 | ||
nfp | ||
null | ||
pcap | ||
qede | ||
ring | ||
sfc | ||
szedata2 | ||
tap | ||
thunderx | ||
vhost | ||
virtio | ||
vmxnet3 | ||
xenvirt | ||
Makefile |