Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
datapath: sample action without side effects
The sample action is rather generic, allowing arbitrary actions to be executed based on a probability. However its use, within the Open vSwitch code-base is limited: only a single user-space action is ever nested. A consequence of the current implementation of sample actions is that depending on weather the sample action executed (due to its probability) any side-effects of nested actions may or may not be present before executing subsequent actions. This has the potential to complicate verification of valid actions by the (kernel) datapath. And indeed adding support for push and pop MPLS actions inside sample actions is one case where such case. In order to allow all supported actions to be continue to be nested inside sample actions without the potential need for complex verification code this patch changes the implementation of the sample action in the kernel datapath so that sample actions are more like a function call and any side effects of nested actions are not present when executing subsequent actions. With the above in mind the motivation for this change is twofold: * To contain side-effects the sample action in the hope of making it easier to deal with in the future and; * To avoid some rather complex verification code introduced in the MPLS datapath patch. Some notes about the implementation: * This patch silently changes the behaviour of sample actions whose nested actions have side-effects. There are no known users of such sample actions. * sample() does not clone the skb for the only known use-case of the sample action: a single nested userspace action. In such a case a clone is not needed as the userspace action has no side effects. Given that there are no known users of other nested actions and in order to avoid the complexity of predicting if other sequences of actions have side-effects in such cases the skb is cloned. * As sample() provides a cloned skb in the unlikely case where there are nested actions other than a single userspace action it is no longer necessary to clone the skb in do_execute_actions() when executing a recirculation action just because the keep_skb parameter is set: this parameter was only set when processing the nested actions of a sample action. Moreover it is possible to remove the keep_skb parameter of do_execute_actions entirely. * As sample() provides either a cloned skb or one that has had a reference taken (using keep_skb) to do_execute_actions() the original skb passed to sample() is never consumed. Thus the caller of sample() (also do_execute_actions()) can use its generic error handling to free the skb on error. Signed-off-by: Simon Horman <[email protected]> Signed-off-by: Jesse Gross <[email protected]>
- Loading branch information