livepatch: Move the result-invariant calculation out of the loop
authorZhen Lei <thunder.leizhen@huawei.com>
Fri, 30 Sep 2022 01:54:46 +0000 (09:54 +0800)
committerJiri Kosina <jkosina@suse.cz>
Tue, 18 Oct 2022 13:50:31 +0000 (15:50 +0200)
The calculation results of the variables 'func_addr' and 'func_size' are
not affected by the for loop and do not change due to the changes of
entries[i]. The performance can be improved by moving it outside the loop.

No functional change.

Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
kernel/livepatch/transition.c

index 30187b1d8275942d6f45bef46ca00c0a825c219f..f1b25ec581e0d9a0783bf5f4a1764b2aa0b50df4 100644 (file)
@@ -196,36 +196,36 @@ static int klp_check_stack_func(struct klp_func *func, unsigned long *entries,
        struct klp_ops *ops;
        int i;
 
-       for (i = 0; i < nr_entries; i++) {
-               address = entries[i];
+       if (klp_target_state == KLP_UNPATCHED) {
+                /*
+                 * Check for the to-be-unpatched function
+                 * (the func itself).
+                 */
+               func_addr = (unsigned long)func->new_func;
+               func_size = func->new_size;
+       } else {
+               /*
+                * Check for the to-be-patched function
+                * (the previous func).
+                */
+               ops = klp_find_ops(func->old_func);
 
-               if (klp_target_state == KLP_UNPATCHED) {
-                        /*
-                         * Check for the to-be-unpatched function
-                         * (the func itself).
-                         */
-                       func_addr = (unsigned long)func->new_func;
-                       func_size = func->new_size;
+               if (list_is_singular(&ops->func_stack)) {
+                       /* original function */
+                       func_addr = (unsigned long)func->old_func;
+                       func_size = func->old_size;
                } else {
-                       /*
-                        * Check for the to-be-patched function
-                        * (the previous func).
-                        */
-                       ops = klp_find_ops(func->old_func);
-
-                       if (list_is_singular(&ops->func_stack)) {
-                               /* original function */
-                               func_addr = (unsigned long)func->old_func;
-                               func_size = func->old_size;
-                       } else {
-                               /* previously patched function */
-                               struct klp_func *prev;
-
-                               prev = list_next_entry(func, stack_node);
-                               func_addr = (unsigned long)prev->new_func;
-                               func_size = prev->new_size;
-                       }
+                       /* previously patched function */
+                       struct klp_func *prev;
+
+                       prev = list_next_entry(func, stack_node);
+                       func_addr = (unsigned long)prev->new_func;
+                       func_size = prev->new_size;
                }
+       }
+
+       for (i = 0; i < nr_entries; i++) {
+               address = entries[i];
 
                if (address >= func_addr && address < func_addr + func_size)
                        return -EAGAIN;