[ovs-dev] [PATCH v2] odp-execute: Skip processing actions when batch is emptied

Vishal Deep Ajmera vishal.deep.ajmera at ericsson.com
Thu Nov 16 06:01:54 UTC 2017


Today in OVS, when errors are encountered during the execution
of an action the entire batch of packets may be deleted (for
e.g. in processing push_tnl_action, if the port is not found
in the port_cache of PMD). The remaining actions continue to
be executed even though there are no packets to be processed.
It is assumed that the code dealing with each action checks that
the batch is not empty before executing. Crashes may occur if
the assumption is not met.

The patch makes OVS skip processing of further actions from the
action-set once a batch is emptied. Doing so centralizes the
check in one place and avoids the possibility of crashes.

Signed-off-by: Vishal Deep Ajmera <vishal.deep.ajmera at ericsson.com>
---
lib/odp-execute.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lib/odp-execute.c b/lib/odp-execute.c
index 3011479..887246d 100644
--- a/lib/odp-execute.c
+++ b/lib/odp-execute.c
@@ -686,9 +686,12 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal,

                 dp_execute_action(dp, batch, a, may_steal);

-                if (last_action) {
-                    /* We do not need to free the packets. dp_execute_actions()
-                     * has stolen them */
+                if (last_action || (batch->count == 0)) {
+                    /* We do not need to free the packets.
+                     * Either dp_execute_actions() has stolen them
+                     * or the batch is freed due to errors. In either
+                     * case we do not need to execute further actions.
+                     */
                     return;
                 }
             }
--
1.9.1


More information about the dev mailing list