On 11 Jun 2026, at 6:58, Adrian Moreno wrote: > Avoid waiting for two rcu periods by scheduling the deletion of the > flow_table and all of its referenced structs at the same time.
Hi Adrian, One small nit below; the code itself looks fine to me. Cheers, Eelco > Signed-off-by: Adrian Moreno <[email protected]> > --- > net/openvswitch/flow_table.c | 27 +++++++++++++++------------ > 1 file changed, 15 insertions(+), 12 deletions(-) > > diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c > index 3934873a44c3..35232e1af8aa 100644 > --- a/net/openvswitch/flow_table.c > +++ b/net/openvswitch/flow_table.c > @@ -527,30 +527,33 @@ static void table_instance_destroy(struct > table_instance *ti, > call_rcu(&ufid_ti->rcu, flow_tbl_destroy_rcu_cb); > } > > -/* No need for locking this function is called from RCU callback. */ > static void ovs_flow_tbl_destroy_rcu(struct rcu_head *rcu) > { > struct flow_table *table = container_of(rcu, struct flow_table, rcu); > > - struct table_instance *ti = rcu_dereference_raw(table->ti); > - struct table_instance *ufid_ti = rcu_dereference_raw(table->ufid_ti); > - struct mask_cache *mc = rcu_dereference_raw(table->mask_cache); > - struct mask_array *ma = rcu_dereference_raw(table->mask_array); > - > - call_rcu(&mc->rcu, mask_cache_rcu_cb); > - call_rcu(&ma->rcu, mask_array_rcu_cb); > - table_instance_destroy(ti, ufid_ti); > mutex_destroy(&table->lock); > kfree(table); > } > > void ovs_flow_tbl_put(struct flow_table *table) > { > + struct table_instance *ufid_ti; > + struct table_instance *ti; > + struct mask_cache *mc; > + struct mask_array *ma; > + > if (refcount_dec_and_test(&table->refcnt)) { > mutex_lock(&table->lock); > - table_instance_flow_flush(table, > - ovs_tbl_dereference(table->ti, table), > - ovs_tbl_dereference(table->ufid_ti, > table)); > + ufid_ti = ovs_tbl_dereference(table->ufid_ti, table); > + ti = ovs_tbl_dereference(table->ti, table); > + table_instance_flow_flush(table, ti, ufid_ti); > + table_instance_destroy(ti, ufid_ti); > + > + mc = ovs_tbl_dereference(table->mask_cache, table); > + ma = ovs_tbl_dereference(table->mask_array, table); > + call_rcu(&mc->rcu, mask_cache_rcu_cb); > + call_rcu(&ma->rcu, mask_array_rcu_cb); nit: Would it be cleaner to extract the destruction logic in ovs_flow_tbl_put() into a separate static function, e.g. ovs_flow_tbl_destroy(), to separate the refcount handling from the actual cleanup? > mutex_unlock(&table->lock); > call_rcu(&table->rcu, ovs_flow_tbl_destroy_rcu); > } _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
