hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/kernel/trace/ftrace.c
....@@ -6271,10 +6271,10 @@
62716271 * reason to cause large interrupt latencies while we do it.
62726272 */
62736273 if (!mod)
6274
- local_irq_save(flags);
6274
+ flags = hard_local_irq_save();
62756275 ftrace_update_code(mod, start_pg);
62766276 if (!mod)
6277
- local_irq_restore(flags);
6277
+ hard_local_irq_restore(flags);
62786278 ret = 0;
62796279 out:
62806280 mutex_unlock(&ftrace_lock);
....@@ -6865,9 +6865,9 @@
68656865 unsigned long count, flags;
68666866 int ret;
68676867
6868
- local_irq_save(flags);
6868
+ flags = hard_local_irq_save();
68696869 ret = ftrace_dyn_arch_init();
6870
- local_irq_restore(flags);
6870
+ hard_local_irq_restore(flags);
68716871 if (ret)
68726872 goto failed;
68736873
....@@ -7022,7 +7022,15 @@
70227022 }
70237023 } while_for_each_ftrace_op(op);
70247024 out:
7025
- preempt_enable_notrace();
7025
+ if (irqs_pipelined() && (hard_irqs_disabled() || !running_inband()))
7026
+ /*
7027
+ * Nothing urgent to schedule here. At latest the
7028
+ * timer tick will pick up whatever the tracing
7029
+ * functions kicked off.
7030
+ */
7031
+ preempt_enable_no_resched_notrace();
7032
+ else
7033
+ preempt_enable_notrace();
70267034 trace_clear_recursion(bit);
70277035 }
70287036