sorry to miss that part,
will take some time to think if we need it or not.
BTW, looks like the kernel handle_upcalls code path has also this issue.
the code is here:
for (i = 0; i < n_ops; i++) {
struct udpif_key *ukey = ops[i].ukey;
if (ukey) {
ovs_mutex_lock(&ukey->mutex);
if (ops[i].dop.error) {
transition_ukey(ukey, UKEY_EVICTED);
} else if (ukey->state < UKEY_OPERATIONAL) {
transition_ukey(ukey, UKEY_OPERATIONAL);
}
ovs_mutex_unlock(&ukey->mutex);
}
}
Eelco Chaudron <[email protected]> 于2022年10月19日周三 18:44写道:
>
>
> On 3 Oct 2022, at 6:02, Peng He wrote:
>
> > push_dp_ops only handles delete ops errors but ignores the modify
> > ops results. It's better to handle all the dp operation errors in
> > a consistent way.
> >
> > We observe in the production environment that sometimes a megaflow
> > with wrong actions keep staying in datapath. The coverage command shows
> > revalidators have dumped several times, however the correct
> > actions are not set. This implies that the ukey's action does not
> > equal to the meagaflow's, i.e. revalidators think the underlying
> > megaflow's actions are correct however they are not.
> >
> > We also check the megaflow using the ofproto/trace command, and the
> > actions are not matched with the ones in the actual magaflow. By
> > performing a revalidator/purge command, the right actions are set.
> >
> > This patch prevents the inconsistency by considering modify failure
> > in revalidators.
> >
> > Signed-off-by: Peng He <[email protected]>
> > ---
> > ofproto/ofproto-dpif-upcall.c | 37 ++++++++++++++++++++++++-----------
> > 1 file changed, 26 insertions(+), 11 deletions(-)
> >
> > diff --git a/ofproto/ofproto-dpif-upcall.c
> b/ofproto/ofproto-dpif-upcall.c
> > index 7ad728adf..dd1abfdee 100644
> > --- a/ofproto/ofproto-dpif-upcall.c
> > +++ b/ofproto/ofproto-dpif-upcall.c
> > @@ -2416,26 +2416,41 @@ push_dp_ops(struct udpif *udpif, struct ukey_op
> *ops, size_t n_ops)
> >
> > for (i = 0; i < n_ops; i++) {
> > struct ukey_op *op = &ops[i];
> > - struct dpif_flow_stats *push, *stats, push_buf;
> > -
> > - stats = op->dop.flow_del.stats;
> > - push = &push_buf;
> > -
> > - if (op->dop.type != DPIF_OP_FLOW_DEL) {
> > - /* Only deleted flows need their stats pushed. */
> > - continue;
> > - }
> >
> > if (op->dop.error) {
> > - /* flow_del error, 'stats' is unusable. */
> > if (op->ukey) {
> > ovs_mutex_lock(&op->ukey->mutex);
> > - transition_ukey(op->ukey, UKEY_EVICTED);
> > + if (op->dop.type == DPIF_OP_FLOW_DEL)
> > + transition_ukey(op->ukey, UKEY_EVICTED);
> > + else {
> > + /* modify error has variety reasons, it's easy
> > + * to transition the state into UKEY_EVICTED, and
> > + * let revalidator_sweep remove the ukey.
> > + *
> > + * In the next round of revalidating, the
> revalidator
> > + * can recover the ukey through
> ukey_create_from_dpif_flow,
> > + * if recover fails, the revalidator will remove
> the datapath
> > + * flow itself.
> > + */
> > + transition_ukey(op->ukey, UKEY_EVICTING);
> > + transition_ukey(op->ukey, UKEY_EVICTED);
> > + }
> > ovs_mutex_unlock(&op->ukey->mutex);
> > }
> > + /* if modify or delete fails, there is no need to push
> stats */
> > continue;
> > }
> >
> > + if (op->dop.type != DPIF_OP_FLOW_DEL) {
> > + /* Only deleted flows need their stats pushed. */
>
> The code looks good, however, what was the conclusion on updating stats on
> other flows that now got deleted instead of updated? Do they not need their
> stats pushed? See v3 discussion.
>
> > + continue;
> > + }
> > +
> > + struct dpif_flow_stats *push, *stats, push_buf;
> > +
> > + stats = op->dop.flow_del.stats;
> > + push = &push_buf;
> > +
> > if (op->ukey) {
> > ovs_mutex_lock(&op->ukey->mutex);
> > transition_ukey(op->ukey, UKEY_EVICTED);
> > --
> > 2.25.1
>
>
--
hepeng
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev