On Wed, Oct 16, 2019 at 5:53 AM <xiangxia.m....@gmail.com> wrote: > > From: Tonghao Zhang <xiangxia.m....@gmail.com> > > When creating and inserting flow-mask, if there is no available > flow-mask, we realloc the mask array. When removing flow-mask, > if necessary, we shrink mask array. > > Signed-off-by: Tonghao Zhang <xiangxia.m....@gmail.com> > Tested-by: Greg Rose <gvrose8...@gmail.com> > ---
LGTM Acked-by: William Tu <u9012...@gmail.com> On the other hand, maybe we should have an upper limit on the mask cash size? Regards, William` > net/openvswitch/flow_table.c | 33 +++++++++++++++++++++++---------- > 1 file changed, 23 insertions(+), 10 deletions(-) > > diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c > index 0d1df53..237cf85 100644 > --- a/net/openvswitch/flow_table.c > +++ b/net/openvswitch/flow_table.c > @@ -693,6 +693,23 @@ static struct table_instance > *table_instance_expand(struct table_instance *ti, > return table_instance_rehash(ti, ti->n_buckets * 2, ufid); > } > > +static void tbl_mask_array_delete_mask(struct mask_array *ma, > + struct sw_flow_mask *mask) > +{ > + int i; > + > + /* Remove the deleted mask pointers from the array */ > + for (i = 0; i < ma->max; i++) { > + if (mask == ovsl_dereference(ma->masks[i])) { > + RCU_INIT_POINTER(ma->masks[i], NULL); > + ma->count--; > + kfree_rcu(mask, rcu); > + return; > + } > + } > + BUG(); > +} > + > /* Remove 'mask' from the mask list, if it is not needed any more. */ > static void flow_mask_remove(struct flow_table *tbl, struct sw_flow_mask > *mask) > { > @@ -706,18 +723,14 @@ static void flow_mask_remove(struct flow_table *tbl, > struct sw_flow_mask *mask) > > if (!mask->ref_count) { > struct mask_array *ma; > - int i; > > ma = ovsl_dereference(tbl->mask_array); > - for (i = 0; i < ma->max; i++) { > - if (mask == ovsl_dereference(ma->masks[i])) { > - RCU_INIT_POINTER(ma->masks[i], NULL); > - ma->count--; > - kfree_rcu(mask, rcu); > - return; > - } > - } > - BUG(); > + tbl_mask_array_delete_mask(ma, mask); > + > + /* Shrink the mask array if necessary. */ > + if (ma->max >= (MASK_ARRAY_SIZE_MIN * 2) && > + ma->count <= (ma->max / 3)) > + tbl_mask_array_realloc(tbl, ma->max / 2); > } > } > } > -- > 1.8.3.1 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev