| 2632 | } |
| 2633 | |
| 2634 | int |
| 2635 | sfc_flow_destroy_locked(struct sfc_adapter *sa, struct rte_flow *flow, |
| 2636 | struct rte_flow_error *error) |
| 2637 | { |
| 2638 | struct rte_flow *flow_ptr; |
| 2639 | int rc = EINVAL; |
| 2640 | |
| 2641 | SFC_ASSERT(sfc_adapter_is_locked(sa)); |
| 2642 | |
| 2643 | TAILQ_FOREACH(flow_ptr, &sa->flow_list, entries) { |
| 2644 | if (flow_ptr == flow) |
| 2645 | rc = 0; |
| 2646 | } |
| 2647 | if (rc != 0) { |
| 2648 | rte_flow_error_set(error, rc, |
| 2649 | RTE_FLOW_ERROR_TYPE_HANDLE, NULL, |
| 2650 | "Failed to find flow rule to destroy"); |
| 2651 | goto fail_bad_value; |
| 2652 | } |
| 2653 | |
| 2654 | if (flow->internal || sa->state == SFC_ETHDEV_STARTED) |
| 2655 | rc = sfc_flow_remove(sa, flow, error); |
| 2656 | |
| 2657 | TAILQ_REMOVE(&sa->flow_list, flow, entries); |
| 2658 | sfc_flow_free(sa, flow); |
| 2659 | |
| 2660 | fail_bad_value: |
| 2661 | return -rc; |
| 2662 | } |
| 2663 | |
| 2664 | static int |
| 2665 | sfc_flow_flush(struct rte_eth_dev *dev, |
no test coverage detected