Thu, Sep 13, 2018 at 10:52:06PM CEST, amritha.namb...@intel.com wrote:

[...]

>+static struct cls_range_filter *range_lookup(struct cls_range_head *head,
>+                                           struct range_flow_key *key,
>+                                           struct range_flow_key *mkey,
>+                                           bool is_skb)
>+{
>+      struct cls_range_filter *filter, *next_filter;
>+      struct range_params range;
>+      int ret;
>+      size_t cmp_size;
>+
>+      list_for_each_entry_safe(filter, next_filter, &head->filters, flist) {

This really should be list_for_each_entry_rcu()

also, as I wrote in the previous email, this should be done in
cls_flower. Look at fl_lookup() it looks-up hashtable. You just need to
add linked list traversal and range comparison to that function for the
hit in the hashtable.


>+              if (!is_skb) {
>+                      /* Existing filter comparison */
>+                      cmp_size = sizeof(filter->mkey);
>+              } else {
>+                      /* skb classification */
>+                      ret = range_compare_params(&range, filter, key,
>+                                                 RANGE_PORT_DST);
>+                      if (ret < 0)
>+                              continue;
>+
>+                      ret = range_compare_params(&range, filter, key,
>+                                                 RANGE_PORT_SRC);
>+                      if (ret < 0)
>+                              continue;
>+
>+                      /* skb does not have min and max values */
>+                      cmp_size = RANGE_KEY_MEMBER_OFFSET(tp_min);
>+              }
>+              if (!memcmp(mkey, &filter->mkey, cmp_size))
>+                      return filter;
>+      }
>+      return NULL;

[...]

Reply via email to