On Wed, Jul 02, 2014 at 08:14:15PM +1200, Joe Stringer wrote:
> If the datapath doesn't dump a flow for some reason, and the current
> dump is expected to revalidate all flows in the datapath, then perform
> revalidation for those flows by fetching them during the sweep phase.
>
> Signed-off-by: Joe Stringer <[email protected]>
> ---
> This relies on the mask dumping from the previous patch, but doesn't
> make use of batched flow_get.
I thought that the logic in revalidator_sweep__() was confusing
before, but this patch left me more confused.
Is this a correct transformation? From:
HMAP_FOR_EACH_SAFE (ukey, next, hmap_node, revalidator->ukeys) {
bool missed_reval, delete_flow;
missed_reval = ukey->last_seen && need_revalidate;
ukey->last_seen++;
delete_flow = purge || ukey->last_seen == MAX_UKEY_AGE;
if (!ukey->flow_exists) {
ukey_delete(revalidator, ukey);
continue;
} else if (!delete_flow && missed_reval) {
delete_flow = handle_missed_revalidation(revalidator, ukey);
}
if (delete_flow) {
struct dump_op *op = &ops[n_ops++];
dump_op_init(op, ukey->key, ukey->key_len, ukey);
if (n_ops == REVALIDATE_MAX_BATCH) {
push_dump_ops(revalidator, ops, n_ops);
n_ops = 0;
}
}
}
to:
HMAP_FOR_EACH_SAFE (ukey, next, hmap_node, revalidator->ukeys) {
if (ukey->flow_exists) {
ukey->last_seen++;
if (purge
|| ukey->last_seen == MAX_UKEY_AGE
|| (ukey->last_seen > 1
&& need_revalidate
&& handle_missed_revalidation(revalidator, ukey))) {
struct dump_op *op = &ops[n_ops++];
dump_op_init(op, ukey->key, ukey->key_len, ukey);
if (n_ops == REVALIDATE_MAX_BATCH) {
push_dump_ops(revalidator, ops, n_ops);
n_ops = 0;
}
}
} else {
ukey_delete(revalidator, ukey);
}
}
I find the latter easier to understand, if it is equivalent.
(I guess that it will change, though, when you revise the series.)
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev