struct nlattr *sample_arg;
        int rem = nla_len(attr);
        const struct sample_arg *arg;
+       u32 init_probability;
        bool clone_flow_key;
+       int err;
 
        /* The first action is always 'OVS_SAMPLE_ATTR_ARG'. */
        sample_arg = nla_data(attr);
        arg = nla_data(sample_arg);
        actions = nla_next(sample_arg, &rem);
+       init_probability = OVS_CB(skb)->probability;
 
        if ((arg->probability != U32_MAX) &&
            (!arg->probability || get_random_u32() > arg->probability)) {
                return 0;
        }
 
+       OVS_CB(skb)->probability = arg->probability;
+
        clone_flow_key = !arg->exec;
-       return clone_execute(dp, skb, key, 0, actions, rem, last,
-                            clone_flow_key);
+       err = clone_execute(dp, skb, key, 0, actions, rem, last,
+                           clone_flow_key);
+
+       if (!last)
+               OVS_CB(skb)->probability = init_probability;
+
+       return err;
 }
 
 /* When 'last' is true, clone() should always consume the 'skb'.
        struct psample_group psample_group = {};
        struct psample_metadata md = {};
        const struct nlattr *a;
+       u32 rate;
        int rem;
 
        nla_for_each_attr(a, nla_data(attr), nla_len(attr), rem) {
        psample_group.net = ovs_dp_get_net(dp);
        md.in_ifindex = OVS_CB(skb)->input_vport->dev->ifindex;
        md.trunc_size = skb->len - OVS_CB(skb)->cutlen;
+       md.rate_as_probability = 1;
+
+       rate = OVS_CB(skb)->probability ? OVS_CB(skb)->probability : U32_MAX;
 
-       psample_sample_packet(&psample_group, skb, 0, &md);
+       psample_sample_packet(&psample_group, skb, rate, &md);
 }
 #else
 static void execute_psample(struct datapath *dp, struct sk_buff *skb,