net/sfc/base: refactor filter lookup loop in EF10
authorIgor Romanov <igor.romanov@oktetlabs.ru>
Tue, 10 Mar 2020 09:48:38 +0000 (09:48 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 18 Mar 2020 09:21:42 +0000 (10:21 +0100)
The code is refactored to make it more clear and allow for
more convenient further changes.

Fixes: e7cd430c864f ("net/sfc/base: import SFN7xxx family support")
Cc: stable@dpdk.org
Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
drivers/net/sfc/base/ef10_filter.c

index e4f8de5..5578765 100644 (file)
@@ -628,56 +628,52 @@ ef10_filter_add_internal(
         * else a free slot to insert at.  If any of them are busy,
         * we have to wait and retry.
         */
-       for (;;) {
-               ins_index = -1;
-               depth = 1;
-               EFSYS_LOCK(enp->en_eslp, state);
-               locked = B_TRUE;
+retry:
+       EFSYS_LOCK(enp->en_eslp, state);
+       locked = B_TRUE;
 
-               for (;;) {
-                       i = (hash + depth) & (EFX_EF10_FILTER_TBL_ROWS - 1);
-                       saved_spec = ef10_filter_entry_spec(eftp, i);
+       ins_index = -1;
 
-                       if (!saved_spec) {
-                               if (ins_index < 0) {
-                                       ins_index = i;
-                               }
-                       } else if (ef10_filter_equal(spec, saved_spec)) {
-                               if (ef10_filter_entry_is_busy(eftp, i))
-                                       break;
-                               if (saved_spec->efs_priority
-                                           == EFX_FILTER_PRI_AUTO) {
-                                       ins_index = i;
-                                       goto found;
-                               } else if (ef10_filter_is_exclusive(spec)) {
-                                       if (may_replace) {
-                                               ins_index = i;
-                                               goto found;
-                                       } else {
-                                               rc = EEXIST;
-                                               goto fail1;
-                                       }
-                               }
+       for (depth = 1; depth <= EF10_FILTER_SEARCH_LIMIT; depth++) {
+               i = (hash + depth) & (EFX_EF10_FILTER_TBL_ROWS - 1);
+               saved_spec = ef10_filter_entry_spec(eftp, i);
+
+               if (saved_spec == NULL) {
+                       if (ins_index < 0)
+                               ins_index = i;
+               } else if (ef10_filter_equal(spec, saved_spec)) {
+                       if (ef10_filter_entry_is_busy(eftp, i)) {
+                               EFSYS_UNLOCK(enp->en_eslp, state);
+                               locked = B_FALSE;
+                               goto retry;
+                       }
 
-                               /* Leave existing */
+                       if (saved_spec->efs_priority == EFX_FILTER_PRI_AUTO) {
+                               ins_index = i;
+                               goto found;
                        }
 
-                       /*
-                        * Once we reach the maximum search depth, use
-                        * the first suitable slot or return EBUSY if
-                        * there was none.
-                        */
-                       if (depth == EF10_FILTER_SEARCH_LIMIT) {
-                               if (ins_index < 0) {
-                                       rc = EBUSY;
-                                       goto fail2;
+                       if (ef10_filter_is_exclusive(spec)) {
+                               if (may_replace) {
+                                       ins_index = i;
+                                       goto found;
+                               } else {
+                                       rc = EEXIST;
+                                       goto fail1;
                                }
-                               goto found;
                        }
-                       depth++;
+
+                       /* Leave existing */
                }
-               EFSYS_UNLOCK(enp->en_eslp, state);
-               locked = B_FALSE;
+       }
+
+       /*
+        * Once we reach the maximum search depth, use the first suitable slot
+        * or return EBUSY if there was none.
+        */
+       if (ins_index < 0) {
+               rc = EBUSY;
+               goto fail2;
        }
 
 found: