[ANNOUNCE] v5.10.8-rt24

From: Sebastian Andrzej Siewior
Date: Tue Jan 19 2021 - 13:14:40 EST


Dear RT folks!

I'm pleased to announce the v5.10.8-rt24 patch set.

Changes since v5.10.8-rt23:

- Added RT's version of __down_read_interruptible() which is used by
stable tree since v5.10.6.

- Updated the "tracing: Merge irqflags + preempt counter." patch to
the latest version posted for upstream.

[ The issues listed below were accidentally lost in the last announcement. ]

Known issues
- kdb/kgdb can easily deadlock.
- kmsg dumpers expecting not to be called in parallel can clobber
their temp buffer.
- netconsole triggers WARN.

The delta patch against v5.10.8-rt23 is appended below and can be found here:

https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/incr/patch-5.10.8-rt23-rt24.patch.xz

You can get this release via the git tree at:

git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v5.10.8-rt24

The RT patch against v5.10.8 can be found here:

https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patch-5.10.8-rt24.patch.xz

The split quilt queue is available at:

https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.8-rt24.tar.xz

Sebastian

diff --git a/include/linux/rwsem-rt.h b/include/linux/rwsem-rt.h
index 7f7e748ef5222..0ba8aae9a1983 100644
--- a/include/linux/rwsem-rt.h
+++ b/include/linux/rwsem-rt.h
@@ -57,6 +57,7 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem)
}

extern void __down_read(struct rw_semaphore *sem);
+extern int __down_read_interruptible(struct rw_semaphore *sem);
extern int __down_read_killable(struct rw_semaphore *sem);
extern int __down_read_trylock(struct rw_semaphore *sem);
extern void __down_write(struct rw_semaphore *sem);
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 79b680067e646..5d08fb467f69a 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -154,14 +154,12 @@ static inline void tracing_generic_entry_update(struct trace_entry *entry,
unsigned short type,
unsigned int trace_ctx)
{
- struct task_struct *tsk = current;
-
entry->preempt_count = trace_ctx & 0xff;
entry->migrate_disable = (trace_ctx >> 8) & 0xff;
entry->preempt_lazy_count = (trace_ctx >> 16) & 0xff;
- entry->pid = (tsk) ? tsk->pid : 0;
+ entry->pid = current->pid;
entry->type = type;
- entry->flags = trace_ctx >> 24;
+ entry->flags = trace_ctx >> 24;
}

unsigned int _tracing_gen_ctx_flags(unsigned long irqflags);
@@ -256,7 +254,7 @@ void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
struct trace_event_file *trace_file,
unsigned long len);

-void trace_event_buffer_commit__(struct trace_event_buffer *fbuffer);
+void trace_event_buffer_commit(struct trace_event_buffer *fbuffer);

enum {
TRACE_EVENT_FL_FILTERED_BIT,
diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
index ec5a7ff786717..7785961d82bae 100644
--- a/include/trace/trace_events.h
+++ b/include/trace/trace_events.h
@@ -694,7 +694,7 @@ trace_event_raw_event_##call(void *__data, proto) \
\
{ assign; } \
\
- trace_event_buffer_commit__(&fbuffer); \
+ trace_event_buffer_commit(&fbuffer); \
}
/*
* The ftrace_test_probe is compiled out, it is only here as a build time check
diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c
index ab05ce0903537..274172d5bb3a5 100644
--- a/kernel/locking/rwsem-rt.c
+++ b/kernel/locking/rwsem-rt.c
@@ -164,6 +164,17 @@ void __down_read(struct rw_semaphore *sem)
WARN_ON_ONCE(ret);
}

+int __down_read_interruptible(struct rw_semaphore *sem)
+{
+ int ret;
+
+ ret = __down_read_common(sem, TASK_INTERRUPTIBLE);
+ if (likely(!ret))
+ return ret;
+ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret);
+ return -EINTR;
+}
+
int __down_read_killable(struct rw_semaphore *sem)
{
int ret;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 2ed294e2c8863..0f9162f0c02a3 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2587,7 +2587,7 @@ static unsigned short migration_disable_value(void)
#endif
}

-static unsigned int __tracing_gen_ctx_flags(unsigned long irqflags)
+unsigned int _tracing_gen_ctx_flags(unsigned long irqflags)
{
unsigned int trace_flags = 0;
unsigned int pc;
@@ -2598,21 +2598,16 @@ static unsigned int __tracing_gen_ctx_flags(unsigned long irqflags)
if (irqs_disabled_flags(irqflags))
trace_flags |= TRACE_FLAG_IRQS_OFF;
#else
- trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT;
+ trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT;
#endif

if (pc & NMI_MASK)
trace_flags |= TRACE_FLAG_NMI;
if (pc & HARDIRQ_MASK)
trace_flags |= TRACE_FLAG_HARDIRQ;
+ if (in_serving_softirq())
+ trace_flags |= TRACE_FLAG_SOFTIRQ;

- if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
- if (in_serving_softirq())
- trace_flags |= TRACE_FLAG_SOFTIRQ;
- } else {
- if (pc & SOFTIRQ_OFFSET)
- trace_flags |= TRACE_FLAG_SOFTIRQ;
- }
if (tif_need_resched())
trace_flags |= TRACE_FLAG_NEED_RESCHED;
if (test_preempt_need_resched())
@@ -2624,11 +2619,6 @@ static unsigned int __tracing_gen_ctx_flags(unsigned long irqflags)
(trace_flags << 24);
}

-unsigned int _tracing_gen_ctx_flags(unsigned long irqflags)
-{
- return __tracing_gen_ctx_flags(irqflags);
-}
-
unsigned int tracing_gen_ctx_flags(void)
{
unsigned long irqflags;
@@ -2890,7 +2880,7 @@ int tracepoint_printk_sysctl(struct ctl_table *table, int write,
return ret;
}

-void trace_event_buffer_commit__(struct trace_event_buffer *fbuffer)
+void trace_event_buffer_commit(struct trace_event_buffer *fbuffer)
{
if (static_key_false(&tracepoint_printk_key.key))
output_printk(fbuffer);
@@ -2901,7 +2891,7 @@ void trace_event_buffer_commit__(struct trace_event_buffer *fbuffer)
fbuffer->event, fbuffer->entry,
fbuffer->trace_ctx, fbuffer->regs);
}
-EXPORT_SYMBOL_GPL(trace_event_buffer_commit__);
+EXPORT_SYMBOL_GPL(trace_event_buffer_commit);

/*
* Skip 3:
@@ -3092,13 +3082,9 @@ void __trace_stack(struct trace_array *tr, unsigned int trace_ctx,
*/
void trace_dump_stack(int skip)
{
- unsigned long flags;
-
if (tracing_disabled || tracing_selftest_running)
return;

- local_save_flags(flags);
-
#ifndef CONFIG_UNWINDER_ORC
/* Skip 1 to skip this function. */
skip++;
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c
index 0de1e9c4d381b..a95b7f1fa351c 100644
--- a/kernel/trace/trace_branch.c
+++ b/kernel/trace/trace_branch.c
@@ -37,7 +37,7 @@ probe_likely_condition(struct ftrace_likely_data *f, int val, int expect)
struct ring_buffer_event *event;
struct trace_branch *entry;
unsigned long flags;
- unsigned int pc;
+ unsigned int trace_ctx;
const char *p;

if (current->trace_recursion & TRACE_BRANCH_BIT)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 257c11f98b786..a38d7edb2fe03 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -3677,7 +3677,6 @@ function_test_events_call(unsigned long ip, unsigned long parent_ip,
struct trace_buffer *buffer;
struct ring_buffer_event *event;
struct ftrace_entry *entry;
- unsigned long flags;
unsigned int trace_ctx;
long disabled;
int cpu;
@@ -3690,8 +3689,6 @@ function_test_events_call(unsigned long ip, unsigned long parent_ip,
if (disabled != 1)
goto out;

- local_save_flags(flags);
-
event = trace_event_buffer_lock_reserve(&buffer, &event_trace_file,
TRACE_FN, sizeof(*entry),
trace_ctx);
diff --git a/kernel/trace/trace_events_inject.c b/kernel/trace/trace_events_inject.c
index a5465a93fc149..65150c0a5e7af 100644
--- a/kernel/trace/trace_events_inject.c
+++ b/kernel/trace/trace_events_inject.c
@@ -25,7 +25,7 @@ trace_inject_entry(struct trace_event_file *file, void *rec, int len)
if (entry) {
memcpy(entry, rec, len);
written = len;
- trace_event_buffer_commit__(&fbuffer);
+ trace_event_buffer_commit(&fbuffer);
}
rcu_read_unlock_sched();

diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c
index 2fc59be73a288..881df991742ab 100644
--- a/kernel/trace/trace_events_synth.c
+++ b/kernel/trace/trace_events_synth.c
@@ -504,7 +504,7 @@ static notrace void trace_event_raw_event_synth(void *__data,
}
}

- trace_event_buffer_commit__(&fbuffer);
+ trace_event_buffer_commit(&fbuffer);
out:
ring_buffer_nest_end(buffer);
}
@@ -1494,7 +1494,7 @@ __synth_event_trace_start(struct trace_event_file *file,
static inline void
__synth_event_trace_end(struct synth_event_trace_state *trace_state)
{
- trace_event_buffer_commit__(&trace_state->fbuffer);
+ trace_event_buffer_commit(&trace_state->fbuffer);

ring_buffer_nest_end(trace_state->buffer);
}
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index 7066faab29e7a..52ab6cf49d767 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -185,7 +185,7 @@ function_stack_trace_call(unsigned long ip, unsigned long parent_ip,
unsigned long flags;
long disabled;
int cpu;
- int trace_ctx;
+ unsigned int trace_ctx;

if (unlikely(!tr->function_enabled))
return;
@@ -200,7 +200,7 @@ function_stack_trace_call(unsigned long ip, unsigned long parent_ip,
disabled = atomic_inc_return(&data->disabled);

if (likely(disabled == 1)) {
- trace_ctx = tracing_gen_ctx_flags();
+ trace_ctx = _tracing_gen_ctx_flags(flags);
trace_function(tr, ip, parent_ip, trace_ctx);
__trace_stack(tr, trace_ctx, STACK_SKIP);
}
@@ -405,10 +405,8 @@ ftrace_traceoff(unsigned long ip, unsigned long parent_ip,

static __always_inline void trace_stack(struct trace_array *tr)
{
- unsigned long flags;
unsigned int trace_ctx;

- local_save_flags(flags);
trace_ctx = tracing_gen_ctx_flags();

__trace_stack(tr, trace_ctx, FTRACE_STACK_SKIP);
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 966b1a16fe6ae..7bf4d63c02206 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -1402,7 +1402,7 @@ __kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
entry->ip = (unsigned long)tk->rp.kp.addr;
store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);

- trace_event_buffer_commit__(&fbuffer);
+ trace_event_buffer_commit(&fbuffer);
}

static void
@@ -1449,7 +1449,7 @@ __kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
entry->ret_ip = (unsigned long)ri->ret_addr;
store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);

- trace_event_buffer_commit__(&fbuffer);
+ trace_event_buffer_commit(&fbuffer);
}

static void
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c
index 795935a669f97..e8bb2d8149e63 100644
--- a/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/trace/trace_sched_wakeup.c
@@ -116,7 +116,6 @@ static int wakeup_graph_entry(struct ftrace_graph_ent *trace)
{
struct trace_array *tr = wakeup_trace;
struct trace_array_cpu *data;
- unsigned long flags;
unsigned int trace_ctx;
int ret = 0;

@@ -135,7 +134,6 @@ static int wakeup_graph_entry(struct ftrace_graph_ent *trace)
if (!func_prolog_preempt_disable(tr, &data, &trace_ctx))
return 0;

- local_save_flags(flags);
ret = __trace_graph_entry(tr, trace, trace_ctx);
atomic_dec(&data->disabled);
preempt_enable_notrace();
@@ -147,7 +145,6 @@ static void wakeup_graph_return(struct ftrace_graph_ret *trace)
{
struct trace_array *tr = wakeup_trace;
struct trace_array_cpu *data;
- unsigned long flags;
unsigned int trace_ctx;

ftrace_graph_addr_finish(trace);
@@ -155,7 +152,6 @@ static void wakeup_graph_return(struct ftrace_graph_ret *trace)
if (!func_prolog_preempt_disable(tr, &data, &trace_ctx))
return;

- local_save_flags(flags);
__trace_graph_return(tr, trace, trace_ctx);
atomic_dec(&data->disabled);

@@ -456,8 +452,6 @@ probe_wakeup_sched_switch(void *ignore, bool preempt,
if (next != wakeup_task)
return;

- trace_ctx = tracing_gen_ctx_flags();
-
/* disable local data, not wakeup_cpu data */
cpu = raw_smp_processor_id();
disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled);
@@ -465,6 +459,8 @@ probe_wakeup_sched_switch(void *ignore, bool preempt,
goto out;

local_irq_save(flags);
+ trace_ctx = _tracing_gen_ctx_flags(flags);
+
arch_spin_lock(&wakeup_lock);

/* We could race with grabbing wakeup_lock */
@@ -528,7 +524,6 @@ probe_wakeup(void *ignore, struct task_struct *p)
{
struct trace_array_cpu *data;
int cpu = smp_processor_id();
- unsigned long flags;
long disabled;
unsigned int trace_ctx;

@@ -551,11 +546,12 @@ probe_wakeup(void *ignore, struct task_struct *p)
(!dl_task(p) && (p->prio >= wakeup_prio || p->prio >= current->prio)))
return;

- trace_ctx = tracing_gen_ctx_flags();
disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled);
if (unlikely(disabled != 1))
goto out;

+ trace_ctx = tracing_gen_ctx_flags();
+
/* interrupts should be off from try_to_wake_up */
arch_spin_lock(&wakeup_lock);

@@ -582,8 +578,6 @@ probe_wakeup(void *ignore, struct task_struct *p)

wakeup_task = get_task_struct(p);

- local_save_flags(flags);
-
data = per_cpu_ptr(wakeup_trace->array_buffer.data, wakeup_cpu);
data->preempt_timestamp = ftrace_now(cpu);
tracing_sched_wakeup_trace(wakeup_trace, p, current, trace_ctx);
diff --git a/localversion-rt b/localversion-rt
index 9a218ca230534..b2111a212663a 100644
--- a/localversion-rt
+++ b/localversion-rt
@@ -1 +1 @@
--rt23
+-rt24