HomeFreeBSD

ena: Move ena_copy_eni_metrics into separate task

Description

ena: Move ena_copy_eni_metrics into separate task

Copying ENI metrics was done in callout context, this caused the driver
to panic when sample_interval was set to a value other than 0, as the
admin queue call which was executed could sleep while waiting on
a condition variable. Taskqueue, unlike callout, allows for sleeping, so
moving the function to a separate taskqueue fixes the problem.
ena_timer_service is still responsible for scheduling the taskqueue.

Stop draining the callout during ena_up/ena_down. This was done to
prevent a race between ena_up/down and ena_copy_eni_metrics admin queue
calls. Since ena_metrics_task is protected by ENA_LOCK there is no
possibility of a race between ena_up/down and ena_metrics_task.

Remove a comment about locking in ena_timer_service. With ENI metrics
in a separate task this comment became obsolete.

Obtained from: Semihalf
MFC after: 2 weeks
Sponsored by: Amazon, Inc.

(cherry picked from commit b899a02ad7330cae3c9bb08ad7975601dc3b9551)

Details

Provenance
dgr_semihalf.comAuthored on Jun 10 2022, 9:18 AM
mwCommitted on Jul 26 2022, 7:30 PM
Parents
rGc5da1ee63d03: ena: Use atomic_load/store functions for first_interrupt variable
Branches
Unknown
Tags
Unknown