Two entries being added at the same time to the IFLA policy table, whilst parallel bug fixes to decnet routing dst handling overlapping with the dst gc removal in net-next.
Showing the changes to kernel (8 of 213 files). Show all
Unified · Split
| @@ -1312,8 +1312,10 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) · 1311 unmodified lines | ||
| 1312 | 1312 | ret = __irq_set_trigger(desc, |
| 1313 | 1313 | new->flags & IRQF_TRIGGER_MASK); |
| 1314 | 1314 | |
| 1315 | − if (ret) | |
| 1315 | + if (ret) { | |
| 1316 | + irq_release_resources(desc); | |
| 1316 | 1317 | goto out_mask; |
| 1318 | + } | |
| 1317 | 1319 | } |
| 1318 | 1320 | |
| 1319 | 1321 | desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \ |
| @@ -59,7 +59,11 @@ static void notrace klp_ftrace_handler(unsigned long ip, · 58 unmodified lines | ||
| 59 | 59 | |
| 60 | 60 | ops = container_of(fops, struct klp_ops, fops); |
| 61 | 61 | |
| 62 | − rcu_read_lock(); | |
| 62 | + /* | |
| 63 | + * A variant of synchronize_sched() is used to allow patching functions | |
| 64 | + * where RCU is not watching, see klp_synchronize_transition(). | |
| 65 | + */ | |
| 66 | + preempt_disable_notrace(); | |
| 63 | 67 | |
| 64 | 68 | func = list_first_or_null_rcu(&ops->func_stack, struct klp_func, |
| 65 | 69 | stack_node); |
| @@ -115,7 +119,7 @@ static void notrace klp_ftrace_handler(unsigned long ip, · 49 unmodified lines | ||
| 115 | 119 | |
| 116 | 120 | klp_arch_set_pc(regs, (unsigned long)func->new_func); |
| 117 | 121 | unlock: |
| 118 | − rcu_read_unlock(); | |
| 122 | + preempt_enable_notrace(); | |
| 119 | 123 | } |
| 120 | 124 | |
| 121 | 125 | /* |
| @@ -48,6 +48,28 @@ static void klp_transition_work_fn(struct work_struct *work) · 47 unmodified lines | ||
| 48 | 48 | } |
| 49 | 49 | static DECLARE_DELAYED_WORK(klp_transition_work, klp_transition_work_fn); |
| 50 | 50 | |
| 51 | +/* | |
| 52 | + * This function is just a stub to implement a hard force | |
| 53 | + * of synchronize_sched(). This requires synchronizing | |
| 54 | + * tasks even in userspace and idle. | |
| 55 | + */ | |
| 56 | +static void klp_sync(struct work_struct *work) | |
| 57 | +{ | |
| 58 | +} | |
| 59 | + | |
| 60 | +/* | |
| 61 | + * We allow to patch also functions where RCU is not watching, | |
| 62 | + * e.g. before user_exit(). We can not rely on the RCU infrastructure | |
| 63 | + * to do the synchronization. Instead hard force the sched synchronization. | |
| 64 | + * | |
| 65 | + * This approach allows to use RCU functions for manipulating func_stack | |
| 66 | + * safely. | |
| 67 | + */ | |
| 68 | +static void klp_synchronize_transition(void) | |
| 69 | +{ | |
| 70 | + schedule_on_each_cpu(klp_sync); | |
| 71 | +} | |
| 72 | + | |
| 51 | 73 | /* |
| 52 | 74 | * The transition to the target patch state is complete. Clean up the data |
| 53 | 75 | * structures. |
| @@ -73,7 +95,7 @@ static void klp_complete_transition(void) · 19 unmodified lines | ||
| 73 | 95 | * func->transition gets cleared, the handler may choose a |
| 74 | 96 | * removed function. |
| 75 | 97 | */ |
| 76 | − synchronize_rcu(); | |
| 98 | + klp_synchronize_transition(); | |
| 77 | 99 | } |
| 78 | 100 | |
| 79 | 101 | if (klp_transition_patch->immediate) |
| @@ -92,7 +114,7 @@ static void klp_complete_transition(void) · 12 unmodified lines | ||
| 92 | 114 | |
| 93 | 115 | /* Prevent klp_ftrace_handler() from seeing KLP_UNDEFINED state */ |
| 94 | 116 | if (klp_target_state == KLP_PATCHED) |
| 95 | − synchronize_rcu(); | |
| 117 | + klp_synchronize_transition(); | |
| 96 | 118 | |
| 97 | 119 | read_lock(&tasklist_lock); |
| 98 | 120 | for_each_process_thread(g, task) { |
| @@ -136,7 +158,11 @@ void klp_cancel_transition(void) · 37 unmodified lines | ||
| 136 | 158 | */ |
| 137 | 159 | void klp_update_patch_state(struct task_struct *task) |
| 138 | 160 | { |
| 139 | − rcu_read_lock(); | |
| 161 | + /* | |
| 162 | + * A variant of synchronize_sched() is used to allow patching functions | |
| 163 | + * where RCU is not watching, see klp_synchronize_transition(). | |
| 164 | + */ | |
| 165 | + preempt_disable_notrace(); | |
| 140 | 166 | |
| 141 | 167 | /* |
| 142 | 168 | * This test_and_clear_tsk_thread_flag() call also serves as a read |
| @@ -153,7 +179,7 @@ void klp_update_patch_state(struct task_struct *task) · 10 unmodified lines | ||
| 153 | 179 | if (test_and_clear_tsk_thread_flag(task, TIF_PATCH_PENDING)) |
| 154 | 180 | task->patch_state = READ_ONCE(klp_target_state); |
| 155 | 181 | |
| 156 | − rcu_read_unlock(); | |
| 182 | + preempt_enable_notrace(); | |
| 157 | 183 | } |
| 158 | 184 | |
| 159 | 185 | /* |
| @@ -539,7 +565,7 @@ void klp_reverse_transition(void) · 379 unmodified lines | ||
| 539 | 565 | clear_tsk_thread_flag(idle_task(cpu), TIF_PATCH_PENDING); |
| 540 | 566 | |
| 541 | 567 | /* Let any remaining calls to klp_update_patch_state() complete */ |
| 542 | − synchronize_rcu(); | |
| 568 | + klp_synchronize_transition(); | |
| 543 | 569 | |
| 544 | 570 | klp_start_transition(); |
| 545 | 571 | } |
| @@ -5605,7 +5605,7 @@ void idle_task_exit(void) · 5604 unmodified lines | ||
| 5605 | 5605 | BUG_ON(cpu_online(smp_processor_id())); |
| 5606 | 5606 | |
| 5607 | 5607 | if (mm != &init_mm) { |
| 5608 | − switch_mm_irqs_off(mm, &init_mm, current); | |
| 5608 | + switch_mm(mm, &init_mm, current); | |
| 5609 | 5609 | finish_arch_post_lock_switch(); |
| 5610 | 5610 | } |
| 5611 | 5611 | mmdrop(mm); |
| @@ -3563,7 +3563,7 @@ static inline void check_schedstat_required(void) · 3562 unmodified lines | ||
| 3563 | 3563 | trace_sched_stat_runtime_enabled()) { |
| 3564 | 3564 | printk_deferred_once("Scheduler tracepoints stat_sleep, stat_iowait, " |
| 3565 | 3565 | "stat_blocked and stat_runtime require the " |
| 3566 | − "kernel parameter schedstats=enabled or " | |
| 3566 | + "kernel parameter schedstats=enable or " | |
| 3567 | 3567 | "kernel.sched_schedstats=1\n"); |
| 3568 | 3568 | } |
| 3569 | 3569 | #endif |
| @@ -387,7 +387,7 @@ void alarm_start_relative(struct alarm *alarm, ktime_t start) · 386 unmodified lines | ||
| 387 | 387 | { |
| 388 | 388 | struct alarm_base *base = &alarm_bases[alarm->type]; |
| 389 | 389 | |
| 390 | − start = ktime_add(start, base->gettime()); | |
| 390 | + start = ktime_add_safe(start, base->gettime()); | |
| 391 | 391 | alarm_start(alarm, start); |
| 392 | 392 | } |
| 393 | 393 | EXPORT_SYMBOL_GPL(alarm_start_relative); |
| @@ -475,7 +475,7 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval) · 81 unmodified lines | ||
| 475 | 475 | overrun++; |
| 476 | 476 | } |
| 477 | 477 | |
| 478 | − alarm->node.expires = ktime_add(alarm->node.expires, interval); | |
| 478 | + alarm->node.expires = ktime_add_safe(alarm->node.expires, interval); | |
| 479 | 479 | return overrun; |
| 480 | 480 | } |
| 481 | 481 | EXPORT_SYMBOL_GPL(alarm_forward); |
| @@ -660,13 +660,21 @@ static int alarm_timer_set(struct k_itimer *timr, int flags, · 178 unmodified lines | ||
| 660 | 660 | |
| 661 | 661 | /* start the timer */ |
| 662 | 662 | timr->it.alarm.interval = timespec64_to_ktime(new_setting->it_interval); |
| 663 | + | |
| 664 | + /* | |
| 665 | + * Rate limit to the tick as a hot fix to prevent DOS. Will be | |
| 666 | + * mopped up later. | |
| 667 | + */ | |
| 668 | + if (timr->it.alarm.interval < TICK_NSEC) | |
| 669 | + timr->it.alarm.interval = TICK_NSEC; | |
| 670 | + | |
| 663 | 671 | exp = timespec64_to_ktime(new_setting->it_value); |
| 664 | 672 | /* Convert (if necessary) to absolute time */ |
| 665 | 673 | if (flags != TIMER_ABSTIME) { |
| 666 | 674 | ktime_t now; |
| 667 | 675 | |
| 668 | 676 | now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime(); |
| 669 | − exp = ktime_add(now, exp); | |
| 677 | + exp = ktime_add_safe(now, exp); | |
| 670 | 678 | } |
| 671 | 679 | |
| 672 | 680 | alarm_start(&timr->it.alarm.alarmtimer, exp); |
| @@ -37,9 +37,11 @@ static int tick_broadcast_forced; · 36 unmodified lines | ||
| 37 | 37 | static __cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(tick_broadcast_lock); |
| 38 | 38 | |
| 39 | 39 | #ifdef CONFIG_TICK_ONESHOT |
| 40 | +static void tick_broadcast_setup_oneshot(struct clock_event_device *bc); | |
| 40 | 41 | static void tick_broadcast_clear_oneshot(int cpu); |
| 41 | 42 | static void tick_resume_broadcast_oneshot(struct clock_event_device *bc); |
| 42 | 43 | #else |
| 44 | +static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) { BUG(); } | |
| 43 | 45 | static inline void tick_broadcast_clear_oneshot(int cpu) { } |
| 44 | 46 | static inline void tick_resume_broadcast_oneshot(struct clock_event_device *bc) { } |
| 45 | 47 | #endif |
| @@ -867,7 +869,7 @@ static void tick_broadcast_init_next_event(struct cpumask *mask, · 821 unmodified lines | ||
| 867 | 869 | /** |
| 868 | 870 | * tick_broadcast_setup_oneshot - setup the broadcast device |
| 869 | 871 | */ |
| 870 | −void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |
| 872 | +static void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |
| 871 | 873 | { |
| 872 | 874 | int cpu = smp_processor_id(); |
| 873 | 875 | |
| @@ -126,7 +126,6 @@ static inline int tick_check_oneshot_change(int allow_nohz) { return 0; } · 125 unmodified lines | ||
| 126 | 126 | |
| 127 | 127 | /* Functions related to oneshot broadcasting */ |
| 128 | 128 | #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT) |
| 129 | −extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); | |
| 130 | 129 | extern void tick_broadcast_switch_to_oneshot(void); |
| 131 | 130 | extern void tick_shutdown_broadcast_oneshot(unsigned int cpu); |
| 132 | 131 | extern int tick_broadcast_oneshot_active(void); |
| @@ -134,7 +133,6 @@ extern void tick_check_oneshot_broadcast_this_cpu(void); · 1 unmodified line | ||
| 134 | 133 | bool tick_broadcast_oneshot_available(void); |
| 135 | 134 | extern struct cpumask *tick_get_broadcast_oneshot_mask(void); |
| 136 | 135 | #else /* !(BROADCAST && ONESHOT): */ |
| 137 | −static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) { BUG(); } | |
| 138 | 136 | static inline void tick_broadcast_switch_to_oneshot(void) { } |
| 139 | 137 | static inline void tick_shutdown_broadcast_oneshot(unsigned int cpu) { } |
| 140 | 138 | static inline int tick_broadcast_oneshot_active(void) { return 0; } |