v5.17-rc2-rt4
Subsystems (12)
Dear RT folks!
I'm pleased to announce the v5.17-rc2-rt4 patch set.
Changes since v5.17-rc2-rt3:
- Replace Valentin ARM64 patch regarding arch_faults_on_old_pte() with an alternative version done by him.
- Correct tracing output. Due to a thinko in the preempt-lazy bits, it always reported 'p' for preempt-sched which was not true. Now that field is either empty (.) or showing the need-sched bit (n).
- Update the networking patches based on review on the list.
- Replace the tty/random patches with an alternative approach kindly contributed by Jason A. Donenfeld. They appear to work, more testing is needed.
- Update John's printk series.
Known issues
- netconsole triggers WARN.
- Valentin Schneider reported a few splats on ARM64, see
https://lkml.kernel.org/r/[email protected]
The delta patch against v5.17-rc2-rt3 is appended below and can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/incr/patch-5.17-rc2-rt3-rt4.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.17-rc2-rt4
The RT patch against v5.17-rc2 can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/older/patch-5.17-rc2-rt4.patch.xz
The split quilt queue is available at:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/older/patches-5.17-rc2-rt4.tar.xz
Sebastian
arch/arm64/include/asm/pgtable.h +2 -1
@@ -1001,7 +1001,8 @@ static inline void update_mmu_cache(struct vm_area_struct *vma,*/ static inline bool arch_faults_on_old_pte (void ) { -WARN_ON (is_migratable ()); +/* The register read below requires a stable CPU to make any sense */ +cant_migrate ();return !cpu_has_hw_af (); }
drivers/char/random.c +84 -311
537 lines not on this page · raw message
drivers/net/loopback.c +1 -1
@@ -86,7 +86,7 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, skb->protocol =eth_type_trans (skb, dev); len = skb->len; -if (likely (netif_rx (skb) ==NET_RX_SUCCESS )) +if (likely (__netif_rx (skb) ==NET_RX_SUCCESS ))dev_lstats_add (dev, len);return NETDEV_TX_OK ;
drivers/tty/sysrq.c +2 -0
@@ -594,9 +594,11 @@ void __handle_sysrq(int key, bool check_mask)* should not) and is the invoked operation enabled? */ if (!check_mask ||sysrq_on_mask (op_p->enable_mask)) { +printk_direct_enter ();pr_info ("%s\n" , op_p->action_msg); console_loglevel = orig_log_level; op_p->handler (key); +printk_direct_exit (); }else {pr_info ("This sysrq operation is disabled.\n" ); console_loglevel = orig_log_level;
include/linux/netdevice.h +1 -0
@@ -3669,6 +3669,7 @@ u32 bpf_prog_run_generic_xdp(struct sk_buff *skb, struct xdp_buff *xdp,void generic_xdp_tx (struct sk_buff *skb,struct bpf_prog *xdp_prog);int do_xdp_generic (struct bpf_prog *xdp_prog,struct sk_buff *skb);int netif_rx (struct sk_buff *skb); +int __netif_rx (struct sk_buff *skb);static inline int netif_rx_ni (struct sk_buff *skb) {
include/linux/printk.h +11 -0
@@ -170,6 +170,9 @@ extern void __printk_safe_exit(void);#define printk_deferred_enter __printk_safe_enter#define printk_deferred_exit __printk_safe_exit +extern void printk_direct_enter (void ); +extern void printk_direct_exit (void ); +extern bool pr_flush (int timeout_ms,bool reset_on_progress);/*
@@ -222,6 +225,14 @@ static inline void printk_deferred_exit(void) { } +static inline void printk_direct_enter (void ) +{ +} + +static inline void printk_direct_exit (void ) +{ +} +static inline bool pr_flush (int timeout_ms,bool reset_on_progress) {return true;
include/linux/random.h +0 -1
@@ -36,7 +36,6 @@ static inline void add_latent_entropy(void) {} extern void add_input_randomness(unsigned int type, unsigned int code, unsigned int value) __latent_entropy; extern void add_interrupt_randomness(int irq) __latent_entropy; -extern void process_interrupt_randomness (void );extern void get_random_bytes (void *buf,int nbytes);extern int wait_for_random_bytes (void );
include/linux/sched.h +0 -10
@@ -1735,16 +1735,6 @@ static __always_inline bool is_percpu_thread(void)#endif } -/* Is the current task guaranteed to stay on its current CPU? */ -static inline bool is_migratable (void ) -{ -#ifdef CONFIG_SMP -return preemptible () && !current->migration_disabled; -#else -return false; -#endif -} -/* Per-process atomic flags. */ #define PFA_NO_NEW_PRIVS 0/* May not gain new privileges. */ #define PFA_SPREAD_PAGE 1/* Spread page cache over cpuset */
include/trace/events/random.h +0 -6
@@ -52,12 +52,6 @@ DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes,TP_ARGS (bytes,IP ) ); -DEFINE_EVENT (random__mix_pool_bytes, mix_pool_bytes_nolock, - TP_PROTO(int bytes, unsigned long IP), - -TP_ARGS (bytes,IP ) -); - TRACE_EVENT(credit_entropy_bits, TP_PROTO(int bits, int entropy_count, unsigned long IP),
kernel/hung_task.c +10 -1
@@ -127,6 +127,8 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)* complain: */ if (sysctl_hung_task_warnings) { +printk_direct_enter (); +if (sysctl_hung_task_warnings >0 ) sysctl_hung_task_warnings--; pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
@@ -142,6 +144,8 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)if (sysctl_hung_task_all_cpu_backtrace) hung_task_show_all_bt = true; + +printk_direct_exit (); }touch_nmi_watchdog ();
@@ -204,12 +208,17 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) } unlock:rcu_read_unlock (); -if (hung_task_show_lock) +if (hung_task_show_lock) { +printk_direct_enter ();debug_show_all_locks (); +printk_direct_exit (); + }if (hung_task_show_all_bt) { hung_task_show_all_bt = false; +printk_direct_enter ();trigger_all_cpu_backtrace (); +printk_direct_exit (); }if (hung_task_call_panic)
kernel/irq/manage.c +0 -3
@@ -1281,9 +1281,6 @@ static int irq_thread(void *data)if (action_ret ==IRQ_WAKE_THREAD )irq_wake_secondary (desc, action); -if (IS_ENABLED (CONFIG_PREEMPT_RT )) -process_interrupt_randomness (); -wake_threads_waitq (desc); }
kernel/printk/printk.c +38 -11
92 lines not on this page · raw message
kernel/rcu/tree_stall.h +2 -0
@@ -587,6 +587,7 @@ static void print_cpu_stall(unsigned long gps)* See Documentation/RCU/stallwarn.rst for info on how to debug * RCU CPU stall warnings. */ +printk_direct_enter ();trace_rcu_stall_warning (rcu_state.name,TPS ("SelfDetected" ));pr_err ("INFO: %s self-detected stall on CPU\n" , rcu_state.name);raw_spin_lock_irqsave_rcu_node (rdp->mynode, flags);
@@ -621,6 +622,7 @@ static void print_cpu_stall(unsigned long gps)*/ set_tsk_need_resched (current);set_preempt_need_resched (); +printk_direct_exit (); }static void check_cpu_stall (struct rcu_data *rdp)
kernel/reboot.c +13 -1
@@ -447,9 +447,11 @@ static int __orderly_reboot(void) ret =run_cmd (reboot_cmd);if (ret) { +printk_direct_enter ();pr_warn ("Failed to start orderly reboot: forcing the issue\n" );emergency_sync ();kernel_restart (NULL ); +printk_direct_exit (); }return ret;
@@ -462,6 +464,7 @@ static int __orderly_poweroff(bool force) ret =run_cmd (poweroff_cmd);if (ret && force) { +printk_direct_enter ();pr_warn ("Failed to start orderly shutdown: forcing the issue\n" );/*
@@ -471,6 +474,7 @@ static int __orderly_poweroff(bool force)*/ emergency_sync ();kernel_power_off (); +printk_direct_exit (); }return ret;
@@ -528,6 +532,8 @@ EXPORT_SYMBOL_GPL(orderly_reboot);*/ static void hw_failure_emergency_poweroff_func (struct work_struct *work) { +printk_direct_enter (); +/* * We have reached here after the emergency shutdown waiting period has * expired. This means orderly_poweroff has not been able to shut off
@@ -544,6 +550,8 @@ static void hw_failure_emergency_poweroff_func(struct work_struct *work)*/ pr_emerg ("Hardware protection shutdown failed. Trying emergency restart\n" );emergency_restart (); + +printk_direct_exit (); } static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
@@ -582,11 +590,13 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced) {static atomic_t allow_proceed =ATOMIC_INIT (1 ); +printk_direct_enter (); +pr_emerg ("HARDWARE PROTECTION shutdown (%s)\n" , reason);/* Shutdown should be initiated only once. */ if (!atomic_dec_and_test (&allow_proceed)) -return ; + goto out;/* * Queue a backup emergency shutdown in the event of
@@ -594,6 +604,8 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)*/ hw_failure_emergency_poweroff (ms_until_forced);orderly_poweroff (true); +out: +printk_direct_exit (); }EXPORT_SYMBOL_GPL (hw_protection_shutdown);
kernel/trace/trace_output.c +4 -2
@@ -463,17 +463,19 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)switch (entry->flags & (TRACE_FLAG_NEED_RESCHED |TRACE_FLAG_PREEMPT_RESCHED )) { +#ifndef CONFIG_PREEMPT_LAZY case TRACE_FLAG_NEED_RESCHED |TRACE_FLAG_PREEMPT_RESCHED : need_resched ='N' ;break ; -#ifndef CONFIG_PREEMPT_LAZY +#endif case TRACE_FLAG_NEED_RESCHED : need_resched ='n' ;break ; -#endif +#ifndef CONFIG_PREEMPT_LAZY case TRACE_FLAG_PREEMPT_RESCHED : need_resched ='p' ;break ; +#endif default : need_resched ='.' ;break ;
kernel/watchdog.c +4 -0
@@ -424,6 +424,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)/* Start period for the next softlockup warning. */ update_report_ts (); +printk_direct_enter (); +pr_emerg ("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n" ,smp_processor_id (), duration, current->comm,task_pid_nr (current));
@@ -442,6 +444,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)add_taint (TAINT_SOFTLOCKUP ,LOCKDEP_STILL_OK );if (softlockup_panic)panic ("softlockup: hung tasks" ); + +printk_direct_exit (); }return HRTIMER_RESTART ;
kernel/watchdog_hld.c +4 -0
@@ -135,6 +135,8 @@ static void watchdog_overflow_callback(struct perf_event *event,if (__this_cpu_read (hard_watchdog_warn) == true)return ; +printk_direct_enter (); +pr_emerg ("Watchdog detected hard LOCKUP on cpu %d\n" , this_cpu);print_modules ();
@@ -155,6 +157,8 @@ static void watchdog_overflow_callback(struct perf_event *event,if (hardlockup_panic)nmi_panic (regs,"Hard LOCKUP" ); +printk_direct_exit (); +__this_cpu_write (hard_watchdog_warn, true);return ; }
lib/dump_stack.c +2 -0
@@ -102,9 +102,11 @@ asmlinkage __visible void dump_stack_lvl(const char *log_lvl)* Permit this cpu to perform nested stack dumps while serialising * against other CPUs */ +printk_direct_enter ();printk_cpu_sync_get_irqsave (flags);__dump_stack (log_lvl);printk_cpu_sync_put_irqrestore (flags); +printk_direct_exit (); }EXPORT_SYMBOL (dump_stack_lvl);
lib/nmi_backtrace.c +2 -0
@@ -99,6 +99,7 @@ bool nmi_cpu_backtrace(struct pt_regs *regs)* Allow nested NMI backtraces while serializing * against other CPUs. */ +printk_direct_enter ();printk_cpu_sync_get_irqsave (flags);if (!READ_ONCE (backtrace_idle) && regs &&cpu_in_idle (instruction_pointer (regs))) { pr_warn("NMI backtrace for cpu %d skipped: idling at %pS\n",
@@ -111,6 +112,7 @@ bool nmi_cpu_backtrace(struct pt_regs *regs)dump_stack (); }printk_cpu_sync_put_irqrestore (flags); +printk_direct_exit ();cpumask_clear_cpu (cpu,to_cpumask (backtrace_mask));return true; }
localversion-rt +1 -1
@@ -1 +1 @@ --rt3 +-rt4
net/core/dev.c +18 -19
@@ -4478,11 +4478,11 @@ static void rps_trigger_softirq(void *data)* If yes, queue it to our IPI list and return 1 * If no, return 0 */ -static int rps_ipi_queued (struct softnet_data *sd) +static int napi_schedule_rps (struct softnet_data *sd) { -#ifdef CONFIG_RPS struct softnet_data *mysd =this_cpu_ptr (&softnet_data); +#ifdef CONFIG_RPS if (sd != mysd) { sd->rps_ipi_next = mysd->rps_ipi_list; mysd->rps_ipi_list = sd;
@@ -4491,6 +4491,7 @@ static int rps_ipi_queued(struct softnet_data *sd) return 1; }#endif /* CONFIG_RPS */ +__napi_schedule_irqoff (&mysd->backlog);return 0 ; }
@@ -4562,18 +4563,9 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu,/* Schedule NAPI for backlog device * We can use non atomic operation since we own the queue lock -* PREEMPT_RT needs to disable interrupts here for -* synchronisation needed in napi_schedule. */ -if (IS_ENABLED (CONFIG_PREEMPT_RT )) -local_irq_disable (); - -if (!__test_and_set_bit (NAPI_STATE_SCHED , &sd->backlog.state)) { -if (!rps_ipi_queued (sd)) -____napi_schedule (sd, &sd->backlog); - } -if (IS_ENABLED (CONFIG_PREEMPT_RT )) -local_irq_enable (); +if (!__test_and_set_bit (NAPI_STATE_SCHED , &sd->backlog.state)) +napi_schedule_rps (sd); goto enqueue; }
@@ -4839,6 +4831,16 @@ static int netif_rx_internal(struct sk_buff *skb)return ret; } +int __netif_rx (struct sk_buff *skb) +{ +int ret; + +trace_netif_rx_entry (skb); + ret =netif_rx_internal (skb); +trace_netif_rx_exit (ret); +return ret; +} +/** * netif_rx - post buffer to the network code * @skb: buffer to post
@@ -4847,24 +4849,21 @@ static int netif_rx_internal(struct sk_buff *skb)* the upper (protocol) levels to process. It always succeeds. The buffer * may be dropped during processing for congestion control or by the * protocol layers. +* This interface is considered legacy. Modern NIC driver should use NAPI +* and GRO. * * return values: * NET_RX_SUCCESS (no congestion) * NET_RX_DROP (packet was dropped) * */ -int netif_rx (struct sk_buff *skb) {int ret;local_bh_disable (); -trace_netif_rx_entry (skb); - - ret =netif_rx_internal (skb); -trace_netif_rx_exit (ret); + ret =__netif_rx (skb);local_bh_enable (); -return ret; }EXPORT_SYMBOL (netif_rx);