extern asmlinkage void preempt_schedule(void);
 extern asmlinkage void preempt_schedule_thunk(void);
 
-#define __preempt_schedule_func preempt_schedule_thunk
+#define preempt_schedule_dynamic_enabled       preempt_schedule_thunk
+#define preempt_schedule_dynamic_disabled      NULL
 
 extern asmlinkage void preempt_schedule_notrace(void);
 extern asmlinkage void preempt_schedule_notrace_thunk(void);
 
-#define __preempt_schedule_notrace_func preempt_schedule_notrace_thunk
+#define preempt_schedule_notrace_dynamic_enabled       preempt_schedule_notrace_thunk
+#define preempt_schedule_notrace_dynamic_disabled      NULL
 
 #ifdef CONFIG_PREEMPT_DYNAMIC
 
-DECLARE_STATIC_CALL(preempt_schedule, __preempt_schedule_func);
+DECLARE_STATIC_CALL(preempt_schedule, preempt_schedule_dynamic_enabled);
 
 #define __preempt_schedule() \
 do { \
        asm volatile ("call " STATIC_CALL_TRAMP_STR(preempt_schedule) : ASM_CALL_CONSTRAINT); \
 } while (0)
 
-DECLARE_STATIC_CALL(preempt_schedule_notrace, __preempt_schedule_notrace_func);
+DECLARE_STATIC_CALL(preempt_schedule_notrace, preempt_schedule_notrace_dynamic_enabled);
 
 #define __preempt_schedule_notrace() \
 do { \
 
 EXPORT_SYMBOL(preempt_schedule);
 
 #ifdef CONFIG_PREEMPT_DYNAMIC
-DEFINE_STATIC_CALL(preempt_schedule, __preempt_schedule_func);
+#ifndef preempt_schedule_dynamic_enabled
+#define preempt_schedule_dynamic_enabled       preempt_schedule
+#define preempt_schedule_dynamic_disabled      NULL
+#endif
+DEFINE_STATIC_CALL(preempt_schedule, preempt_schedule_dynamic_enabled);
 EXPORT_STATIC_CALL_TRAMP(preempt_schedule);
 #endif
 
 EXPORT_SYMBOL_GPL(preempt_schedule_notrace);
 
 #ifdef CONFIG_PREEMPT_DYNAMIC
-DEFINE_STATIC_CALL(preempt_schedule_notrace, __preempt_schedule_notrace_func);
+#ifndef preempt_schedule_notrace_dynamic_enabled
+#define preempt_schedule_notrace_dynamic_enabled       preempt_schedule_notrace
+#define preempt_schedule_notrace_dynamic_disabled      NULL
+#endif
+DEFINE_STATIC_CALL(preempt_schedule_notrace, preempt_schedule_notrace_dynamic_enabled);
 EXPORT_STATIC_CALL_TRAMP(preempt_schedule_notrace);
 #endif
 
 #endif
 
 #ifdef CONFIG_PREEMPT_DYNAMIC
+#define cond_resched_dynamic_enabled   __cond_resched
+#define cond_resched_dynamic_disabled  ((void *)&__static_call_return0)
 DEFINE_STATIC_CALL_RET0(cond_resched, __cond_resched);
 EXPORT_STATIC_CALL_TRAMP(cond_resched);
 
+#define might_resched_dynamic_enabled  __cond_resched
+#define might_resched_dynamic_disabled ((void *)&__static_call_return0)
 DEFINE_STATIC_CALL_RET0(might_resched, __cond_resched);
 EXPORT_STATIC_CALL_TRAMP(might_resched);
 #endif
        return -EINVAL;
 }
 
+#define preempt_dynamic_enable(f)      static_call_update(f, f##_dynamic_enabled)
+#define preempt_dynamic_disable(f)     static_call_update(f, f##_dynamic_disabled)
+
 void sched_dynamic_update(int mode)
 {
        /*
         * Avoid {NONE,VOLUNTARY} -> FULL transitions from ever ending up in
         * the ZERO state, which is invalid.
         */
-       static_call_update(cond_resched, __cond_resched);
-       static_call_update(might_resched, __cond_resched);
-       static_call_update(preempt_schedule, __preempt_schedule_func);
-       static_call_update(preempt_schedule_notrace, __preempt_schedule_notrace_func);
-       static_call_update(irqentry_exit_cond_resched, irqentry_exit_cond_resched);
+       preempt_dynamic_enable(cond_resched);
+       preempt_dynamic_enable(might_resched);
+       preempt_dynamic_enable(preempt_schedule);
+       preempt_dynamic_enable(preempt_schedule_notrace);
+       preempt_dynamic_enable(irqentry_exit_cond_resched);
 
        switch (mode) {
        case preempt_dynamic_none:
-               static_call_update(cond_resched, __cond_resched);
-               static_call_update(might_resched, (void *)&__static_call_return0);
-               static_call_update(preempt_schedule, NULL);
-               static_call_update(preempt_schedule_notrace, NULL);
-               static_call_update(irqentry_exit_cond_resched, NULL);
+               preempt_dynamic_enable(cond_resched);
+               preempt_dynamic_disable(might_resched);
+               preempt_dynamic_disable(preempt_schedule);
+               preempt_dynamic_disable(preempt_schedule_notrace);
+               preempt_dynamic_disable(irqentry_exit_cond_resched);
                pr_info("Dynamic Preempt: none\n");
                break;
 
        case preempt_dynamic_voluntary:
-               static_call_update(cond_resched, __cond_resched);
-               static_call_update(might_resched, __cond_resched);
-               static_call_update(preempt_schedule, NULL);
-               static_call_update(preempt_schedule_notrace, NULL);
-               static_call_update(irqentry_exit_cond_resched, NULL);
+               preempt_dynamic_enable(cond_resched);
+               preempt_dynamic_enable(might_resched);
+               preempt_dynamic_disable(preempt_schedule);
+               preempt_dynamic_disable(preempt_schedule_notrace);
+               preempt_dynamic_disable(irqentry_exit_cond_resched);
                pr_info("Dynamic Preempt: voluntary\n");
                break;
 
        case preempt_dynamic_full:
-               static_call_update(cond_resched, (void *)&__static_call_return0);
-               static_call_update(might_resched, (void *)&__static_call_return0);
-               static_call_update(preempt_schedule, __preempt_schedule_func);
-               static_call_update(preempt_schedule_notrace, __preempt_schedule_notrace_func);
-               static_call_update(irqentry_exit_cond_resched, irqentry_exit_cond_resched);
+               preempt_dynamic_disable(cond_resched);
+               preempt_dynamic_disable(might_resched);
+               preempt_dynamic_enable(preempt_schedule);
+               preempt_dynamic_enable(preempt_schedule_notrace);
+               preempt_dynamic_enable(irqentry_exit_cond_resched);
                pr_info("Dynamic Preempt: full\n");
                break;
        }