summaryrefslogtreecommitdiff
path: root/target/linux
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/patches/4.9.22/patch-realtime5861
1 files changed, 4020 insertions, 1841 deletions
diff --git a/target/linux/patches/4.9.22/patch-realtime b/target/linux/patches/4.9.22/patch-realtime
index abc03f9f5..271c2db5a 100644
--- a/target/linux/patches/4.9.22/patch-realtime
+++ b/target/linux/patches/4.9.22/patch-realtime
@@ -1,6 +1,6 @@
-diff -Nur linux-4.9.6.orig/arch/arm/include/asm/irq.h linux-4.9.6/arch/arm/include/asm/irq.h
---- linux-4.9.6.orig/arch/arm/include/asm/irq.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/include/asm/irq.h 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/include/asm/irq.h linux-4.9.22/arch/arm/include/asm/irq.h
+--- linux-4.9.22.orig/arch/arm/include/asm/irq.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/include/asm/irq.h 2017-04-18 17:19:16.618770722 +0200
@@ -22,6 +22,8 @@
#endif
@@ -10,9 +10,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/include/asm/irq.h linux-4.9.6/arch/arm/inclu
struct irqaction;
struct pt_regs;
extern void migrate_irqs(void);
-diff -Nur linux-4.9.6.orig/arch/arm/include/asm/switch_to.h linux-4.9.6/arch/arm/include/asm/switch_to.h
---- linux-4.9.6.orig/arch/arm/include/asm/switch_to.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/include/asm/switch_to.h 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/include/asm/switch_to.h linux-4.9.22/arch/arm/include/asm/switch_to.h
+--- linux-4.9.22.orig/arch/arm/include/asm/switch_to.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/include/asm/switch_to.h 2017-04-18 17:19:16.618770722 +0200
@@ -3,6 +3,13 @@
#include <linux/thread_info.h>
@@ -35,9 +35,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/include/asm/switch_to.h linux-4.9.6/arch/arm
last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \
} while (0)
-diff -Nur linux-4.9.6.orig/arch/arm/include/asm/thread_info.h linux-4.9.6/arch/arm/include/asm/thread_info.h
---- linux-4.9.6.orig/arch/arm/include/asm/thread_info.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/include/asm/thread_info.h 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/include/asm/thread_info.h linux-4.9.22/arch/arm/include/asm/thread_info.h
+--- linux-4.9.22.orig/arch/arm/include/asm/thread_info.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/include/asm/thread_info.h 2017-04-18 17:19:16.618770722 +0200
@@ -49,6 +49,7 @@
struct thread_info {
unsigned long flags; /* low level flags */
@@ -74,9 +74,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/include/asm/thread_info.h linux-4.9.6/arch/a
#endif /* __KERNEL__ */
#endif /* __ASM_ARM_THREAD_INFO_H */
-diff -Nur linux-4.9.6.orig/arch/arm/Kconfig linux-4.9.6/arch/arm/Kconfig
---- linux-4.9.6.orig/arch/arm/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/Kconfig 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/Kconfig linux-4.9.22/arch/arm/Kconfig
+--- linux-4.9.22.orig/arch/arm/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/Kconfig 2017-04-18 17:19:16.618770722 +0200
@@ -36,7 +36,7 @@
select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
@@ -94,9 +94,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/Kconfig linux-4.9.6/arch/arm/Kconfig
select HAVE_RCU_TABLE_FREE if (SMP && ARM_LPAE)
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_SYSCALL_TRACEPOINTS
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/asm-offsets.c linux-4.9.6/arch/arm/kernel/asm-offsets.c
---- linux-4.9.6.orig/arch/arm/kernel/asm-offsets.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/asm-offsets.c 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/asm-offsets.c linux-4.9.22/arch/arm/kernel/asm-offsets.c
+--- linux-4.9.22.orig/arch/arm/kernel/asm-offsets.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/asm-offsets.c 2017-04-18 17:19:16.618770722 +0200
@@ -65,6 +65,7 @@
BLANK();
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
@@ -105,9 +105,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/asm-offsets.c linux-4.9.6/arch/arm/ke
DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
DEFINE(TI_TASK, offsetof(struct thread_info, task));
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/entry-armv.S linux-4.9.6/arch/arm/kernel/entry-armv.S
---- linux-4.9.6.orig/arch/arm/kernel/entry-armv.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/entry-armv.S 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/entry-armv.S linux-4.9.22/arch/arm/kernel/entry-armv.S
+--- linux-4.9.22.orig/arch/arm/kernel/entry-armv.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/entry-armv.S 2017-04-18 17:19:16.622770857 +0200
@@ -220,11 +220,18 @@
#ifdef CONFIG_PREEMPT
@@ -145,9 +145,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/entry-armv.S linux-4.9.6/arch/arm/ker
#endif
__und_fault:
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/entry-common.S linux-4.9.6/arch/arm/kernel/entry-common.S
---- linux-4.9.6.orig/arch/arm/kernel/entry-common.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/entry-common.S 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/entry-common.S linux-4.9.22/arch/arm/kernel/entry-common.S
+--- linux-4.9.22.orig/arch/arm/kernel/entry-common.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/entry-common.S 2017-04-18 17:19:16.622770857 +0200
@@ -36,7 +36,9 @@
UNWIND(.cantunwind )
disable_irq_notrace @ disable interrupts
@@ -172,9 +172,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/entry-common.S linux-4.9.6/arch/arm/k
UNWIND(.fnend )
ENDPROC(ret_fast_syscall)
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/patch.c linux-4.9.6/arch/arm/kernel/patch.c
---- linux-4.9.6.orig/arch/arm/kernel/patch.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/patch.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/patch.c linux-4.9.22/arch/arm/kernel/patch.c
+--- linux-4.9.22.orig/arch/arm/kernel/patch.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/patch.c 2017-04-18 17:19:16.622770857 +0200
@@ -15,7 +15,7 @@
unsigned int insn;
};
@@ -202,9 +202,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/patch.c linux-4.9.6/arch/arm/kernel/p
else
__release(&patch_lock);
}
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/process.c linux-4.9.6/arch/arm/kernel/process.c
---- linux-4.9.6.orig/arch/arm/kernel/process.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/process.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/process.c linux-4.9.22/arch/arm/kernel/process.c
+--- linux-4.9.22.orig/arch/arm/kernel/process.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/process.c 2017-04-18 17:19:16.622770857 +0200
@@ -322,6 +322,30 @@
}
@@ -236,9 +236,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/process.c linux-4.9.6/arch/arm/kernel
#ifdef CONFIG_KUSER_HELPERS
/*
* The vectors page is always readable from user space for the
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/signal.c linux-4.9.6/arch/arm/kernel/signal.c
---- linux-4.9.6.orig/arch/arm/kernel/signal.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/signal.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/signal.c linux-4.9.22/arch/arm/kernel/signal.c
+--- linux-4.9.22.orig/arch/arm/kernel/signal.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/signal.c 2017-04-18 17:19:16.622770857 +0200
@@ -572,7 +572,8 @@
*/
trace_hardirqs_off();
@@ -249,9 +249,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/signal.c linux-4.9.6/arch/arm/kernel/
schedule();
} else {
if (unlikely(!user_mode(regs)))
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/smp.c linux-4.9.6/arch/arm/kernel/smp.c
---- linux-4.9.6.orig/arch/arm/kernel/smp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/smp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/smp.c linux-4.9.22/arch/arm/kernel/smp.c
+--- linux-4.9.22.orig/arch/arm/kernel/smp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/smp.c 2017-04-18 17:19:16.622770857 +0200
@@ -234,8 +234,6 @@
flush_cache_louis();
local_flush_tlb_all();
@@ -271,9 +271,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/smp.c linux-4.9.6/arch/arm/kernel/smp
pr_notice("CPU%u: shutdown\n", cpu);
/*
-diff -Nur linux-4.9.6.orig/arch/arm/kernel/unwind.c linux-4.9.6/arch/arm/kernel/unwind.c
---- linux-4.9.6.orig/arch/arm/kernel/unwind.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kernel/unwind.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kernel/unwind.c linux-4.9.22/arch/arm/kernel/unwind.c
+--- linux-4.9.22.orig/arch/arm/kernel/unwind.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kernel/unwind.c 2017-04-18 17:19:16.622770857 +0200
@@ -93,7 +93,7 @@
static const struct unwind_idx *__origin_unwind_idx;
extern const struct unwind_idx __stop_unwind_idx[];
@@ -325,9 +325,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kernel/unwind.c linux-4.9.6/arch/arm/kernel/
kfree(tab);
}
-diff -Nur linux-4.9.6.orig/arch/arm/kvm/arm.c linux-4.9.6/arch/arm/kvm/arm.c
---- linux-4.9.6.orig/arch/arm/kvm/arm.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/kvm/arm.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/kvm/arm.c linux-4.9.22/arch/arm/kvm/arm.c
+--- linux-4.9.22.orig/arch/arm/kvm/arm.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/kvm/arm.c 2017-04-18 17:19:16.622770857 +0200
@@ -619,7 +619,7 @@
* involves poking the GIC, which must be done in a
* non-preemptible context.
@@ -355,9 +355,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/kvm/arm.c linux-4.9.6/arch/arm/kvm/arm.c
ret = handle_exit(vcpu, run, ret);
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-exynos/platsmp.c linux-4.9.6/arch/arm/mach-exynos/platsmp.c
---- linux-4.9.6.orig/arch/arm/mach-exynos/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-exynos/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-exynos/platsmp.c linux-4.9.22/arch/arm/mach-exynos/platsmp.c
+--- linux-4.9.22.orig/arch/arm/mach-exynos/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-exynos/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -229,7 +229,7 @@
return (void __iomem *)(S5P_VA_SCU);
}
@@ -405,9 +405,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-exynos/platsmp.c linux-4.9.6/arch/arm/m
return pen_release != -1 ? ret : 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-hisi/platmcpm.c linux-4.9.6/arch/arm/mach-hisi/platmcpm.c
---- linux-4.9.6.orig/arch/arm/mach-hisi/platmcpm.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-hisi/platmcpm.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-hisi/platmcpm.c linux-4.9.22/arch/arm/mach-hisi/platmcpm.c
+--- linux-4.9.22.orig/arch/arm/mach-hisi/platmcpm.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-hisi/platmcpm.c 2017-04-18 17:19:16.622770857 +0200
@@ -61,7 +61,7 @@
static void __iomem *sysctrl, *fabric;
@@ -493,9 +493,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-hisi/platmcpm.c linux-4.9.6/arch/arm/ma
return 0;
}
#endif
-diff -Nur linux-4.9.6.orig/arch/arm/mach-omap2/omap-smp.c linux-4.9.6/arch/arm/mach-omap2/omap-smp.c
---- linux-4.9.6.orig/arch/arm/mach-omap2/omap-smp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-omap2/omap-smp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-omap2/omap-smp.c linux-4.9.22/arch/arm/mach-omap2/omap-smp.c
+--- linux-4.9.22.orig/arch/arm/mach-omap2/omap-smp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-omap2/omap-smp.c 2017-04-18 17:19:16.622770857 +0200
@@ -64,7 +64,7 @@
.startup_addr = omap5_secondary_startup,
};
@@ -534,9 +534,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-omap2/omap-smp.c linux-4.9.6/arch/arm/m
return 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-prima2/platsmp.c linux-4.9.6/arch/arm/mach-prima2/platsmp.c
---- linux-4.9.6.orig/arch/arm/mach-prima2/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-prima2/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-prima2/platsmp.c linux-4.9.22/arch/arm/mach-prima2/platsmp.c
+--- linux-4.9.22.orig/arch/arm/mach-prima2/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-prima2/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -22,7 +22,7 @@
static void __iomem *clk_base;
@@ -575,9 +575,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-prima2/platsmp.c linux-4.9.6/arch/arm/m
return pen_release != -1 ? -ENOSYS : 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-qcom/platsmp.c linux-4.9.6/arch/arm/mach-qcom/platsmp.c
---- linux-4.9.6.orig/arch/arm/mach-qcom/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-qcom/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-qcom/platsmp.c linux-4.9.22/arch/arm/mach-qcom/platsmp.c
+--- linux-4.9.22.orig/arch/arm/mach-qcom/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-qcom/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -46,7 +46,7 @@
extern void secondary_startup_arm(void);
@@ -616,9 +616,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-qcom/platsmp.c linux-4.9.6/arch/arm/mac
return ret;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-spear/platsmp.c linux-4.9.6/arch/arm/mach-spear/platsmp.c
---- linux-4.9.6.orig/arch/arm/mach-spear/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-spear/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-spear/platsmp.c linux-4.9.22/arch/arm/mach-spear/platsmp.c
+--- linux-4.9.22.orig/arch/arm/mach-spear/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-spear/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -32,7 +32,7 @@
sync_cache_w(&pen_release);
}
@@ -657,9 +657,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-spear/platsmp.c linux-4.9.6/arch/arm/ma
return pen_release != -1 ? -ENOSYS : 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mach-sti/platsmp.c linux-4.9.6/arch/arm/mach-sti/platsmp.c
---- linux-4.9.6.orig/arch/arm/mach-sti/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mach-sti/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mach-sti/platsmp.c linux-4.9.22/arch/arm/mach-sti/platsmp.c
+--- linux-4.9.22.orig/arch/arm/mach-sti/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mach-sti/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -35,7 +35,7 @@
sync_cache_w(&pen_release);
}
@@ -698,9 +698,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mach-sti/platsmp.c linux-4.9.6/arch/arm/mach
return pen_release != -1 ? -ENOSYS : 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mm/fault.c linux-4.9.6/arch/arm/mm/fault.c
---- linux-4.9.6.orig/arch/arm/mm/fault.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mm/fault.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mm/fault.c linux-4.9.22/arch/arm/mm/fault.c
+--- linux-4.9.22.orig/arch/arm/mm/fault.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mm/fault.c 2017-04-18 17:19:16.622770857 +0200
@@ -430,6 +430,9 @@
if (addr < TASK_SIZE)
return do_page_fault(addr, fsr, regs);
@@ -721,9 +721,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mm/fault.c linux-4.9.6/arch/arm/mm/fault.c
do_bad_area(addr, fsr, regs);
return 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm/mm/highmem.c linux-4.9.6/arch/arm/mm/highmem.c
---- linux-4.9.6.orig/arch/arm/mm/highmem.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/mm/highmem.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/mm/highmem.c linux-4.9.22/arch/arm/mm/highmem.c
+--- linux-4.9.22.orig/arch/arm/mm/highmem.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/mm/highmem.c 2017-04-18 17:19:16.622770857 +0200
@@ -34,6 +34,11 @@
return *ptep;
}
@@ -854,9 +854,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/mm/highmem.c linux-4.9.6/arch/arm/mm/highmem
+ }
+}
+#endif
-diff -Nur linux-4.9.6.orig/arch/arm/plat-versatile/platsmp.c linux-4.9.6/arch/arm/plat-versatile/platsmp.c
---- linux-4.9.6.orig/arch/arm/plat-versatile/platsmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm/plat-versatile/platsmp.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm/plat-versatile/platsmp.c linux-4.9.22/arch/arm/plat-versatile/platsmp.c
+--- linux-4.9.22.orig/arch/arm/plat-versatile/platsmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm/plat-versatile/platsmp.c 2017-04-18 17:19:16.622770857 +0200
@@ -32,7 +32,7 @@
sync_cache_w(&pen_release);
}
@@ -895,9 +895,9 @@ diff -Nur linux-4.9.6.orig/arch/arm/plat-versatile/platsmp.c linux-4.9.6/arch/ar
return pen_release != -1 ? -ENOSYS : 0;
}
-diff -Nur linux-4.9.6.orig/arch/arm64/include/asm/thread_info.h linux-4.9.6/arch/arm64/include/asm/thread_info.h
---- linux-4.9.6.orig/arch/arm64/include/asm/thread_info.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm64/include/asm/thread_info.h 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm64/include/asm/thread_info.h linux-4.9.22/arch/arm64/include/asm/thread_info.h
+--- linux-4.9.22.orig/arch/arm64/include/asm/thread_info.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm64/include/asm/thread_info.h 2017-04-18 17:19:16.622770857 +0200
@@ -49,6 +49,7 @@
mm_segment_t addr_limit; /* address limit */
struct task_struct *task; /* main task structure */
@@ -933,9 +933,9 @@ diff -Nur linux-4.9.6.orig/arch/arm64/include/asm/thread_info.h linux-4.9.6/arch
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
_TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
-diff -Nur linux-4.9.6.orig/arch/arm64/Kconfig linux-4.9.6/arch/arm64/Kconfig
---- linux-4.9.6.orig/arch/arm64/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm64/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm64/Kconfig linux-4.9.22/arch/arm64/Kconfig
+--- linux-4.9.22.orig/arch/arm64/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm64/Kconfig 2017-04-18 17:19:16.622770857 +0200
@@ -91,6 +91,7 @@
select HAVE_PERF_EVENTS
select HAVE_PERF_REGS
@@ -944,7 +944,7 @@ diff -Nur linux-4.9.6.orig/arch/arm64/Kconfig linux-4.9.6/arch/arm64/Kconfig
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_RCU_TABLE_FREE
select HAVE_SYSCALL_TRACEPOINTS
-@@ -694,7 +695,7 @@
+@@ -704,7 +705,7 @@
config XEN
bool "Xen guest support on ARM64"
@@ -953,9 +953,9 @@ diff -Nur linux-4.9.6.orig/arch/arm64/Kconfig linux-4.9.6/arch/arm64/Kconfig
select SWIOTLB_XEN
select PARAVIRT
help
-diff -Nur linux-4.9.6.orig/arch/arm64/kernel/asm-offsets.c linux-4.9.6/arch/arm64/kernel/asm-offsets.c
---- linux-4.9.6.orig/arch/arm64/kernel/asm-offsets.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm64/kernel/asm-offsets.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm64/kernel/asm-offsets.c linux-4.9.22/arch/arm64/kernel/asm-offsets.c
+--- linux-4.9.22.orig/arch/arm64/kernel/asm-offsets.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm64/kernel/asm-offsets.c 2017-04-18 17:19:16.622770857 +0200
@@ -38,6 +38,7 @@
BLANK();
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
@@ -964,9 +964,9 @@ diff -Nur linux-4.9.6.orig/arch/arm64/kernel/asm-offsets.c linux-4.9.6/arch/arm6
DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
DEFINE(TI_TASK, offsetof(struct thread_info, task));
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
-diff -Nur linux-4.9.6.orig/arch/arm64/kernel/entry.S linux-4.9.6/arch/arm64/kernel/entry.S
---- linux-4.9.6.orig/arch/arm64/kernel/entry.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm64/kernel/entry.S 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm64/kernel/entry.S linux-4.9.22/arch/arm64/kernel/entry.S
+--- linux-4.9.22.orig/arch/arm64/kernel/entry.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm64/kernel/entry.S 2017-04-18 17:19:16.622770857 +0200
@@ -428,11 +428,16 @@
#ifdef CONFIG_PREEMPT
@@ -995,9 +995,9 @@ diff -Nur linux-4.9.6.orig/arch/arm64/kernel/entry.S linux-4.9.6/arch/arm64/kern
ret x24
#endif
-diff -Nur linux-4.9.6.orig/arch/arm64/kernel/signal.c linux-4.9.6/arch/arm64/kernel/signal.c
---- linux-4.9.6.orig/arch/arm64/kernel/signal.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/arm64/kernel/signal.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/arm64/kernel/signal.c linux-4.9.22/arch/arm64/kernel/signal.c
+--- linux-4.9.22.orig/arch/arm64/kernel/signal.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/arm64/kernel/signal.c 2017-04-18 17:19:16.622770857 +0200
@@ -409,7 +409,7 @@
*/
trace_hardirqs_off();
@@ -1007,9 +1007,9 @@ diff -Nur linux-4.9.6.orig/arch/arm64/kernel/signal.c linux-4.9.6/arch/arm64/ker
schedule();
} else {
local_irq_enable();
-diff -Nur linux-4.9.6.orig/arch/Kconfig linux-4.9.6/arch/Kconfig
---- linux-4.9.6.orig/arch/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/Kconfig 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/arch/Kconfig linux-4.9.22/arch/Kconfig
+--- linux-4.9.22.orig/arch/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/Kconfig 2017-04-18 17:19:16.618770722 +0200
@@ -9,6 +9,7 @@
tristate "OProfile system profiling"
depends on PROFILING
@@ -1026,9 +1026,9 @@ diff -Nur linux-4.9.6.orig/arch/Kconfig linux-4.9.6/arch/Kconfig
help
This option enables a transparent branch optimization that
makes certain almost-always-true or almost-always-false branch
-diff -Nur linux-4.9.6.orig/arch/mips/Kconfig linux-4.9.6/arch/mips/Kconfig
---- linux-4.9.6.orig/arch/mips/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/mips/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/mips/Kconfig linux-4.9.22/arch/mips/Kconfig
+--- linux-4.9.22.orig/arch/mips/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/mips/Kconfig 2017-04-18 17:19:16.622770857 +0200
@@ -2514,7 +2514,7 @@
#
config HIGHMEM
@@ -1038,9 +1038,9 @@ diff -Nur linux-4.9.6.orig/arch/mips/Kconfig linux-4.9.6/arch/mips/Kconfig
config CPU_SUPPORTS_HIGHMEM
bool
-diff -Nur linux-4.9.6.orig/arch/powerpc/include/asm/thread_info.h linux-4.9.6/arch/powerpc/include/asm/thread_info.h
---- linux-4.9.6.orig/arch/powerpc/include/asm/thread_info.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/include/asm/thread_info.h 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/include/asm/thread_info.h linux-4.9.22/arch/powerpc/include/asm/thread_info.h
+--- linux-4.9.22.orig/arch/powerpc/include/asm/thread_info.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/include/asm/thread_info.h 2017-04-18 17:19:16.626771037 +0200
@@ -43,6 +43,8 @@
int cpu; /* cpu we're on */
int preempt_count; /* 0 => preemptable,
@@ -1087,9 +1087,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/include/asm/thread_info.h linux-4.9.6/ar
/* Bits in local_flags */
/* Don't move TLF_NAPPING without adjusting the code in entry_32.S */
-diff -Nur linux-4.9.6.orig/arch/powerpc/Kconfig linux-4.9.6/arch/powerpc/Kconfig
---- linux-4.9.6.orig/arch/powerpc/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/Kconfig linux-4.9.22/arch/powerpc/Kconfig
+--- linux-4.9.22.orig/arch/powerpc/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/Kconfig 2017-04-18 17:19:16.626771037 +0200
@@ -52,10 +52,11 @@
config RWSEM_GENERIC_SPINLOCK
@@ -1120,9 +1120,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/Kconfig linux-4.9.6/arch/powerpc/Kconfig
source kernel/Kconfig.hz
source kernel/Kconfig.preempt
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/asm-offsets.c linux-4.9.6/arch/powerpc/kernel/asm-offsets.c
---- linux-4.9.6.orig/arch/powerpc/kernel/asm-offsets.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/asm-offsets.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/asm-offsets.c linux-4.9.22/arch/powerpc/kernel/asm-offsets.c
+--- linux-4.9.22.orig/arch/powerpc/kernel/asm-offsets.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/asm-offsets.c 2017-04-18 17:19:16.626771037 +0200
@@ -156,6 +156,7 @@
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
@@ -1131,9 +1131,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/asm-offsets.c linux-4.9.6/arch/po
DEFINE(TI_TASK, offsetof(struct thread_info, task));
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/entry_32.S linux-4.9.6/arch/powerpc/kernel/entry_32.S
---- linux-4.9.6.orig/arch/powerpc/kernel/entry_32.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/entry_32.S 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/entry_32.S linux-4.9.22/arch/powerpc/kernel/entry_32.S
+--- linux-4.9.22.orig/arch/powerpc/kernel/entry_32.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/entry_32.S 2017-04-18 17:19:16.626771037 +0200
@@ -835,7 +835,14 @@
cmpwi 0,r0,0 /* if non-zero, just restore regs and return */
bne restore
@@ -1182,9 +1182,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/entry_32.S linux-4.9.6/arch/power
bne- do_resched
andi. r0,r9,_TIF_USER_WORK_MASK
beq restore_user
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/entry_64.S linux-4.9.6/arch/powerpc/kernel/entry_64.S
---- linux-4.9.6.orig/arch/powerpc/kernel/entry_64.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/entry_64.S 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/entry_64.S linux-4.9.22/arch/powerpc/kernel/entry_64.S
+--- linux-4.9.22.orig/arch/powerpc/kernel/entry_64.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/entry_64.S 2017-04-18 17:19:16.626771037 +0200
@@ -656,7 +656,7 @@
bl restore_math
b restore
@@ -1223,9 +1223,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/entry_64.S linux-4.9.6/arch/power
bne 1b
/*
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/irq.c linux-4.9.6/arch/powerpc/kernel/irq.c
---- linux-4.9.6.orig/arch/powerpc/kernel/irq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/irq.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/irq.c linux-4.9.22/arch/powerpc/kernel/irq.c
+--- linux-4.9.22.orig/arch/powerpc/kernel/irq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/irq.c 2017-04-18 17:19:16.626771037 +0200
@@ -638,6 +638,7 @@
}
}
@@ -1242,9 +1242,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/irq.c linux-4.9.6/arch/powerpc/ke
irq_hw_number_t virq_to_hw(unsigned int virq)
{
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/misc_32.S linux-4.9.6/arch/powerpc/kernel/misc_32.S
---- linux-4.9.6.orig/arch/powerpc/kernel/misc_32.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/misc_32.S 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/misc_32.S linux-4.9.22/arch/powerpc/kernel/misc_32.S
+--- linux-4.9.22.orig/arch/powerpc/kernel/misc_32.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/misc_32.S 2017-04-18 17:19:16.626771037 +0200
@@ -41,6 +41,7 @@
* We store the saved ksp_limit in the unused part
* of the STACK_FRAME_OVERHEAD
@@ -1261,9 +1261,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/misc_32.S linux-4.9.6/arch/powerp
/*
* void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
-diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/misc_64.S linux-4.9.6/arch/powerpc/kernel/misc_64.S
---- linux-4.9.6.orig/arch/powerpc/kernel/misc_64.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kernel/misc_64.S 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kernel/misc_64.S linux-4.9.22/arch/powerpc/kernel/misc_64.S
+--- linux-4.9.22.orig/arch/powerpc/kernel/misc_64.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kernel/misc_64.S 2017-04-18 17:19:16.626771037 +0200
@@ -31,6 +31,7 @@
.text
@@ -1280,9 +1280,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kernel/misc_64.S linux-4.9.6/arch/powerp
_GLOBAL(call_do_irq)
mflr r0
-diff -Nur linux-4.9.6.orig/arch/powerpc/kvm/Kconfig linux-4.9.6/arch/powerpc/kvm/Kconfig
---- linux-4.9.6.orig/arch/powerpc/kvm/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/kvm/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/kvm/Kconfig linux-4.9.22/arch/powerpc/kvm/Kconfig
+--- linux-4.9.22.orig/arch/powerpc/kvm/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/kvm/Kconfig 2017-04-18 17:19:16.626771037 +0200
@@ -175,6 +175,7 @@
config KVM_MPIC
bool "KVM in-kernel MPIC emulation"
@@ -1291,9 +1291,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/kvm/Kconfig linux-4.9.6/arch/powerpc/kvm
select HAVE_KVM_IRQCHIP
select HAVE_KVM_IRQFD
select HAVE_KVM_IRQ_ROUTING
-diff -Nur linux-4.9.6.orig/arch/powerpc/platforms/ps3/device-init.c linux-4.9.6/arch/powerpc/platforms/ps3/device-init.c
---- linux-4.9.6.orig/arch/powerpc/platforms/ps3/device-init.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/powerpc/platforms/ps3/device-init.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/powerpc/platforms/ps3/device-init.c linux-4.9.22/arch/powerpc/platforms/ps3/device-init.c
+--- linux-4.9.22.orig/arch/powerpc/platforms/ps3/device-init.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/powerpc/platforms/ps3/device-init.c 2017-04-18 17:19:16.626771037 +0200
@@ -752,7 +752,7 @@
}
pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op);
@@ -1303,9 +1303,9 @@ diff -Nur linux-4.9.6.orig/arch/powerpc/platforms/ps3/device-init.c linux-4.9.6/
dev->done.done || kthread_should_stop());
if (kthread_should_stop())
res = -EINTR;
-diff -Nur linux-4.9.6.orig/arch/sh/kernel/irq.c linux-4.9.6/arch/sh/kernel/irq.c
---- linux-4.9.6.orig/arch/sh/kernel/irq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/sh/kernel/irq.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/sh/kernel/irq.c linux-4.9.22/arch/sh/kernel/irq.c
+--- linux-4.9.22.orig/arch/sh/kernel/irq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/sh/kernel/irq.c 2017-04-18 17:19:16.626771037 +0200
@@ -147,6 +147,7 @@
hardirq_ctx[cpu] = NULL;
}
@@ -1322,9 +1322,9 @@ diff -Nur linux-4.9.6.orig/arch/sh/kernel/irq.c linux-4.9.6/arch/sh/kernel/irq.c
#else
static inline void handle_one_irq(unsigned int irq)
{
-diff -Nur linux-4.9.6.orig/arch/sparc/Kconfig linux-4.9.6/arch/sparc/Kconfig
---- linux-4.9.6.orig/arch/sparc/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/sparc/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/sparc/Kconfig linux-4.9.22/arch/sparc/Kconfig
+--- linux-4.9.22.orig/arch/sparc/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/sparc/Kconfig 2017-04-18 17:19:16.626771037 +0200
@@ -194,12 +194,10 @@
source kernel/Kconfig.hz
@@ -1340,9 +1340,9 @@ diff -Nur linux-4.9.6.orig/arch/sparc/Kconfig linux-4.9.6/arch/sparc/Kconfig
config GENERIC_HWEIGHT
bool
-diff -Nur linux-4.9.6.orig/arch/sparc/kernel/irq_64.c linux-4.9.6/arch/sparc/kernel/irq_64.c
---- linux-4.9.6.orig/arch/sparc/kernel/irq_64.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/sparc/kernel/irq_64.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/sparc/kernel/irq_64.c linux-4.9.22/arch/sparc/kernel/irq_64.c
+--- linux-4.9.22.orig/arch/sparc/kernel/irq_64.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/sparc/kernel/irq_64.c 2017-04-18 17:19:16.626771037 +0200
@@ -854,6 +854,7 @@
set_irq_regs(old_regs);
}
@@ -1359,9 +1359,9 @@ diff -Nur linux-4.9.6.orig/arch/sparc/kernel/irq_64.c linux-4.9.6/arch/sparc/ker
#ifdef CONFIG_HOTPLUG_CPU
void fixup_irqs(void)
-diff -Nur linux-4.9.6.orig/arch/x86/crypto/aesni-intel_glue.c linux-4.9.6/arch/x86/crypto/aesni-intel_glue.c
---- linux-4.9.6.orig/arch/x86/crypto/aesni-intel_glue.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/crypto/aesni-intel_glue.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/crypto/aesni-intel_glue.c linux-4.9.22/arch/x86/crypto/aesni-intel_glue.c
+--- linux-4.9.22.orig/arch/x86/crypto/aesni-intel_glue.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/crypto/aesni-intel_glue.c 2017-04-18 17:19:16.626771037 +0200
@@ -372,14 +372,14 @@
err = blkcipher_walk_virt(desc, &walk);
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
@@ -1454,9 +1454,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/crypto/aesni-intel_glue.c linux-4.9.6/arch/x
return err;
}
-diff -Nur linux-4.9.6.orig/arch/x86/crypto/cast5_avx_glue.c linux-4.9.6/arch/x86/crypto/cast5_avx_glue.c
---- linux-4.9.6.orig/arch/x86/crypto/cast5_avx_glue.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/crypto/cast5_avx_glue.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/crypto/cast5_avx_glue.c linux-4.9.22/arch/x86/crypto/cast5_avx_glue.c
+--- linux-4.9.22.orig/arch/x86/crypto/cast5_avx_glue.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/crypto/cast5_avx_glue.c 2017-04-18 17:19:16.626771037 +0200
@@ -59,7 +59,7 @@
static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
bool enc)
@@ -1536,9 +1536,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/crypto/cast5_avx_glue.c linux-4.9.6/arch/x86
if (walk.nbytes) {
ctr_crypt_final(desc, &walk);
err = blkcipher_walk_done(desc, &walk, 0);
-diff -Nur linux-4.9.6.orig/arch/x86/crypto/glue_helper.c linux-4.9.6/arch/x86/crypto/glue_helper.c
---- linux-4.9.6.orig/arch/x86/crypto/glue_helper.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/crypto/glue_helper.c 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/crypto/glue_helper.c linux-4.9.22/arch/x86/crypto/glue_helper.c
+--- linux-4.9.22.orig/arch/x86/crypto/glue_helper.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/crypto/glue_helper.c 2017-04-18 17:19:16.626771037 +0200
@@ -39,7 +39,7 @@
void *ctx = crypto_blkcipher_ctx(desc->tfm);
const unsigned int bsize = 128 / 8;
@@ -1654,9 +1654,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/crypto/glue_helper.c linux-4.9.6/arch/x86/cr
return err;
}
EXPORT_SYMBOL_GPL(glue_xts_crypt_128bit);
-diff -Nur linux-4.9.6.orig/arch/x86/entry/common.c linux-4.9.6/arch/x86/entry/common.c
---- linux-4.9.6.orig/arch/x86/entry/common.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/entry/common.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/entry/common.c linux-4.9.22/arch/x86/entry/common.c
+--- linux-4.9.22.orig/arch/x86/entry/common.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/entry/common.c 2017-04-18 17:19:16.626771037 +0200
@@ -129,7 +129,7 @@
#define EXIT_TO_USERMODE_LOOP_FLAGS \
@@ -1684,9 +1684,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/entry/common.c linux-4.9.6/arch/x86/entry/co
if (cached_flags & _TIF_UPROBE)
uprobe_notify_resume(regs);
-diff -Nur linux-4.9.6.orig/arch/x86/entry/entry_32.S linux-4.9.6/arch/x86/entry/entry_32.S
---- linux-4.9.6.orig/arch/x86/entry/entry_32.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/entry/entry_32.S 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/entry/entry_32.S linux-4.9.22/arch/x86/entry/entry_32.S
+--- linux-4.9.22.orig/arch/x86/entry/entry_32.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/entry/entry_32.S 2017-04-18 17:19:16.626771037 +0200
@@ -308,8 +308,25 @@
ENTRY(resume_kernel)
DISABLE_INTERRUPTS(CLBR_ANY)
@@ -1713,9 +1713,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/entry/entry_32.S linux-4.9.6/arch/x86/entry/
testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ?
jz restore_all
call preempt_schedule_irq
-diff -Nur linux-4.9.6.orig/arch/x86/entry/entry_64.S linux-4.9.6/arch/x86/entry/entry_64.S
---- linux-4.9.6.orig/arch/x86/entry/entry_64.S 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/entry/entry_64.S 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/entry/entry_64.S linux-4.9.22/arch/x86/entry/entry_64.S
+--- linux-4.9.22.orig/arch/x86/entry/entry_64.S 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/entry/entry_64.S 2017-04-18 17:19:16.626771037 +0200
@@ -546,7 +546,23 @@
bt $9, EFLAGS(%rsp) /* were interrupts off? */
jnc 1f
@@ -1756,9 +1756,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/entry/entry_64.S linux-4.9.6/arch/x86/entry/
#ifdef CONFIG_XEN
idtentry xen_hypervisor_callback xen_do_hypervisor_callback has_error_code=0
-diff -Nur linux-4.9.6.orig/arch/x86/include/asm/preempt.h linux-4.9.6/arch/x86/include/asm/preempt.h
---- linux-4.9.6.orig/arch/x86/include/asm/preempt.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/include/asm/preempt.h 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/include/asm/preempt.h linux-4.9.22/arch/x86/include/asm/preempt.h
+--- linux-4.9.22.orig/arch/x86/include/asm/preempt.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/include/asm/preempt.h 2017-04-18 17:19:16.630771208 +0200
@@ -79,17 +79,46 @@
* a decrement which hits zero means we have no preempt_count and should
* reschedule.
@@ -1807,9 +1807,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/include/asm/preempt.h linux-4.9.6/arch/x86/i
}
#ifdef CONFIG_PREEMPT
-diff -Nur linux-4.9.6.orig/arch/x86/include/asm/signal.h linux-4.9.6/arch/x86/include/asm/signal.h
---- linux-4.9.6.orig/arch/x86/include/asm/signal.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/include/asm/signal.h 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/include/asm/signal.h linux-4.9.22/arch/x86/include/asm/signal.h
+--- linux-4.9.22.orig/arch/x86/include/asm/signal.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/include/asm/signal.h 2017-04-18 17:19:16.630771208 +0200
@@ -27,6 +27,19 @@
#define SA_IA32_ABI 0x02000000u
#define SA_X32_ABI 0x01000000u
@@ -1830,9 +1830,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/include/asm/signal.h linux-4.9.6/arch/x86/in
#ifndef CONFIG_COMPAT
typedef sigset_t compat_sigset_t;
#endif
-diff -Nur linux-4.9.6.orig/arch/x86/include/asm/stackprotector.h linux-4.9.6/arch/x86/include/asm/stackprotector.h
---- linux-4.9.6.orig/arch/x86/include/asm/stackprotector.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/include/asm/stackprotector.h 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/include/asm/stackprotector.h linux-4.9.22/arch/x86/include/asm/stackprotector.h
+--- linux-4.9.22.orig/arch/x86/include/asm/stackprotector.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/include/asm/stackprotector.h 2017-04-18 17:19:16.630771208 +0200
@@ -59,7 +59,7 @@
*/
static __always_inline void boot_init_stack_canary(void)
@@ -1858,9 +1858,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/include/asm/stackprotector.h linux-4.9.6/arc
tsc = rdtsc();
canary += tsc + (tsc << 32UL);
-diff -Nur linux-4.9.6.orig/arch/x86/include/asm/thread_info.h linux-4.9.6/arch/x86/include/asm/thread_info.h
---- linux-4.9.6.orig/arch/x86/include/asm/thread_info.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/include/asm/thread_info.h 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/include/asm/thread_info.h linux-4.9.22/arch/x86/include/asm/thread_info.h
+--- linux-4.9.22.orig/arch/x86/include/asm/thread_info.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/include/asm/thread_info.h 2017-04-18 17:19:16.630771208 +0200
@@ -54,11 +54,14 @@
struct thread_info {
@@ -1912,9 +1912,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/include/asm/thread_info.h linux-4.9.6/arch/x
#define STACK_WARN (THREAD_SIZE/8)
/*
-diff -Nur linux-4.9.6.orig/arch/x86/include/asm/uv/uv_bau.h linux-4.9.6/arch/x86/include/asm/uv/uv_bau.h
---- linux-4.9.6.orig/arch/x86/include/asm/uv/uv_bau.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/include/asm/uv/uv_bau.h 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/include/asm/uv/uv_bau.h linux-4.9.22/arch/x86/include/asm/uv/uv_bau.h
+--- linux-4.9.22.orig/arch/x86/include/asm/uv/uv_bau.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/include/asm/uv/uv_bau.h 2017-04-18 17:19:16.630771208 +0200
@@ -624,9 +624,9 @@
cycles_t send_message;
cycles_t period_end;
@@ -1948,9 +1948,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/include/asm/uv/uv_bau.h linux-4.9.6/arch/x86
return 1;
}
-diff -Nur linux-4.9.6.orig/arch/x86/Kconfig linux-4.9.6/arch/x86/Kconfig
---- linux-4.9.6.orig/arch/x86/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/Kconfig 2017-01-28 13:59:09.895654805 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/Kconfig linux-4.9.22/arch/x86/Kconfig
+--- linux-4.9.22.orig/arch/x86/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/Kconfig 2017-04-18 17:19:16.626771037 +0200
@@ -17,6 +17,7 @@
### Arch settings
config X86
@@ -1981,9 +1981,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/Kconfig linux-4.9.6/arch/x86/Kconfig
---help---
Enable maximum number of CPUS and NUMA Nodes for this architecture.
If unsure, say N.
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/acpi/boot.c linux-4.9.6/arch/x86/kernel/acpi/boot.c
---- linux-4.9.6.orig/arch/x86/kernel/acpi/boot.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/acpi/boot.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/acpi/boot.c linux-4.9.22/arch/x86/kernel/acpi/boot.c
+--- linux-4.9.22.orig/arch/x86/kernel/acpi/boot.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/acpi/boot.c 2017-04-18 17:19:16.630771208 +0200
@@ -87,7 +87,9 @@
* ->ioapic_mutex
* ->ioapic_lock
@@ -1994,9 +1994,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/acpi/boot.c linux-4.9.6/arch/x86/kern
/* --------------------------------------------------------------------------
Boot-time Configuration
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/apic/io_apic.c linux-4.9.6/arch/x86/kernel/apic/io_apic.c
---- linux-4.9.6.orig/arch/x86/kernel/apic/io_apic.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/apic/io_apic.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/apic/io_apic.c linux-4.9.22/arch/x86/kernel/apic/io_apic.c
+--- linux-4.9.22.orig/arch/x86/kernel/apic/io_apic.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/apic/io_apic.c 2017-04-18 17:19:16.630771208 +0200
@@ -1712,7 +1712,8 @@
static inline bool ioapic_irqd_mask(struct irq_data *data)
{
@@ -2007,9 +2007,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/apic/io_apic.c linux-4.9.6/arch/x86/k
mask_ioapic_irq(data);
return true;
}
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/asm-offsets.c linux-4.9.6/arch/x86/kernel/asm-offsets.c
---- linux-4.9.6.orig/arch/x86/kernel/asm-offsets.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/asm-offsets.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/asm-offsets.c linux-4.9.22/arch/x86/kernel/asm-offsets.c
+--- linux-4.9.22.orig/arch/x86/kernel/asm-offsets.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/asm-offsets.c 2017-04-18 17:19:16.630771208 +0200
@@ -36,6 +36,7 @@
BLANK();
@@ -2024,9 +2024,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/asm-offsets.c linux-4.9.6/arch/x86/ke
DEFINE(PTREGS_SIZE, sizeof(struct pt_regs));
+ DEFINE(_PREEMPT_ENABLED, PREEMPT_ENABLED);
}
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/cpu/mcheck/mce.c linux-4.9.6/arch/x86/kernel/cpu/mcheck/mce.c
---- linux-4.9.6.orig/arch/x86/kernel/cpu/mcheck/mce.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/cpu/mcheck/mce.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/cpu/mcheck/mce.c linux-4.9.22/arch/x86/kernel/cpu/mcheck/mce.c
+--- linux-4.9.22.orig/arch/x86/kernel/cpu/mcheck/mce.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/cpu/mcheck/mce.c 2017-04-18 17:19:16.630771208 +0200
@@ -41,6 +41,8 @@
#include <linux/debugfs.h>
#include <linux/irq_work.h>
@@ -2268,9 +2268,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/cpu/mcheck/mce.c linux-4.9.6/arch/x86
if (!zalloc_cpumask_var(&mce_device_initialized, GFP_KERNEL)) {
err = -ENOMEM;
goto err_out;
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/irq_32.c linux-4.9.6/arch/x86/kernel/irq_32.c
---- linux-4.9.6.orig/arch/x86/kernel/irq_32.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/irq_32.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/irq_32.c linux-4.9.22/arch/x86/kernel/irq_32.c
+--- linux-4.9.22.orig/arch/x86/kernel/irq_32.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/irq_32.c 2017-04-18 17:19:16.630771208 +0200
@@ -127,6 +127,7 @@
cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu));
}
@@ -2287,9 +2287,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/irq_32.c linux-4.9.6/arch/x86/kernel/
bool handle_irq(struct irq_desc *desc, struct pt_regs *regs)
{
-diff -Nur linux-4.9.6.orig/arch/x86/kernel/process_32.c linux-4.9.6/arch/x86/kernel/process_32.c
---- linux-4.9.6.orig/arch/x86/kernel/process_32.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kernel/process_32.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kernel/process_32.c linux-4.9.22/arch/x86/kernel/process_32.c
+--- linux-4.9.22.orig/arch/x86/kernel/process_32.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kernel/process_32.c 2017-04-18 17:19:16.630771208 +0200
@@ -35,6 +35,7 @@
#include <linux/uaccess.h>
#include <linux/io.h>
@@ -2343,9 +2343,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kernel/process_32.c linux-4.9.6/arch/x86/ker
/*
* Leave lazy mode, flushing any hypercalls made here.
* This must be done before restoring TLS segments so
-diff -Nur linux-4.9.6.orig/arch/x86/kvm/lapic.c linux-4.9.6/arch/x86/kvm/lapic.c
---- linux-4.9.6.orig/arch/x86/kvm/lapic.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kvm/lapic.c 2017-01-28 13:59:09.899654958 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/kvm/lapic.c linux-4.9.22/arch/x86/kvm/lapic.c
+--- linux-4.9.22.orig/arch/x86/kvm/lapic.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kvm/lapic.c 2017-04-18 17:19:16.630771208 +0200
@@ -1939,6 +1939,7 @@
hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
HRTIMER_MODE_ABS_PINNED);
@@ -2354,10 +2354,10 @@ diff -Nur linux-4.9.6.orig/arch/x86/kvm/lapic.c linux-4.9.6/arch/x86/kvm/lapic.c
/*
* APIC is created enabled. This will prevent kvm_lapic_set_base from
-diff -Nur linux-4.9.6.orig/arch/x86/kvm/x86.c linux-4.9.6/arch/x86/kvm/x86.c
---- linux-4.9.6.orig/arch/x86/kvm/x86.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/kvm/x86.c 2017-01-28 13:59:09.903655111 +0100
-@@ -5932,6 +5932,13 @@
+diff -Nur linux-4.9.22.orig/arch/x86/kvm/x86.c linux-4.9.22/arch/x86/kvm/x86.c
+--- linux-4.9.22.orig/arch/x86/kvm/x86.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/kvm/x86.c 2017-04-18 17:19:16.630771208 +0200
+@@ -5933,6 +5933,13 @@
goto out;
}
@@ -2371,9 +2371,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/kvm/x86.c linux-4.9.6/arch/x86/kvm/x86.c
r = kvm_mmu_module_init();
if (r)
goto out_free_percpu;
-diff -Nur linux-4.9.6.orig/arch/x86/mm/highmem_32.c linux-4.9.6/arch/x86/mm/highmem_32.c
---- linux-4.9.6.orig/arch/x86/mm/highmem_32.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/mm/highmem_32.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/mm/highmem_32.c linux-4.9.22/arch/x86/mm/highmem_32.c
+--- linux-4.9.22.orig/arch/x86/mm/highmem_32.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/mm/highmem_32.c 2017-04-18 17:19:16.630771208 +0200
@@ -32,10 +32,11 @@
*/
void *kmap_atomic_prot(struct page *page, pgprot_t prot)
@@ -2418,9 +2418,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/mm/highmem_32.c linux-4.9.6/arch/x86/mm/high
}
EXPORT_SYMBOL(__kunmap_atomic);
-diff -Nur linux-4.9.6.orig/arch/x86/mm/iomap_32.c linux-4.9.6/arch/x86/mm/iomap_32.c
---- linux-4.9.6.orig/arch/x86/mm/iomap_32.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/mm/iomap_32.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/mm/iomap_32.c linux-4.9.22/arch/x86/mm/iomap_32.c
+--- linux-4.9.22.orig/arch/x86/mm/iomap_32.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/mm/iomap_32.c 2017-04-18 17:19:16.630771208 +0200
@@ -56,6 +56,7 @@
void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
@@ -2453,9 +2453,28 @@ diff -Nur linux-4.9.6.orig/arch/x86/mm/iomap_32.c linux-4.9.6/arch/x86/mm/iomap_
kpte_clear_flush(kmap_pte-idx, vaddr);
kmap_atomic_idx_pop();
}
-diff -Nur linux-4.9.6.orig/arch/x86/platform/uv/tlb_uv.c linux-4.9.6/arch/x86/platform/uv/tlb_uv.c
---- linux-4.9.6.orig/arch/x86/platform/uv/tlb_uv.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/platform/uv/tlb_uv.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/mm/pageattr.c linux-4.9.22/arch/x86/mm/pageattr.c
+--- linux-4.9.22.orig/arch/x86/mm/pageattr.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/mm/pageattr.c 2017-04-18 17:19:16.634771367 +0200
+@@ -214,7 +214,15 @@
+ int in_flags, struct page **pages)
+ {
+ unsigned int i, level;
++#ifdef CONFIG_PREEMPT
++ /*
++ * Avoid wbinvd() because it causes latencies on all CPUs,
++ * regardless of any CPU isolation that may be in effect.
++ */
++ unsigned long do_wbinvd = 0;
++#else
+ unsigned long do_wbinvd = cache && numpages >= 1024; /* 4M threshold */
++#endif
+
+ BUG_ON(irqs_disabled());
+
+diff -Nur linux-4.9.22.orig/arch/x86/platform/uv/tlb_uv.c linux-4.9.22/arch/x86/platform/uv/tlb_uv.c
+--- linux-4.9.22.orig/arch/x86/platform/uv/tlb_uv.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/platform/uv/tlb_uv.c 2017-04-18 17:19:16.634771367 +0200
@@ -748,9 +748,9 @@
quiesce_local_uvhub(hmaster);
@@ -2542,9 +2561,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/platform/uv/tlb_uv.c linux-4.9.6/arch/x86/pl
}
}
-diff -Nur linux-4.9.6.orig/arch/x86/platform/uv/uv_time.c linux-4.9.6/arch/x86/platform/uv/uv_time.c
---- linux-4.9.6.orig/arch/x86/platform/uv/uv_time.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/arch/x86/platform/uv/uv_time.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/arch/x86/platform/uv/uv_time.c linux-4.9.22/arch/x86/platform/uv/uv_time.c
+--- linux-4.9.22.orig/arch/x86/platform/uv/uv_time.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/arch/x86/platform/uv/uv_time.c 2017-04-18 17:19:16.634771367 +0200
@@ -57,7 +57,7 @@
/* There is one of these allocated per node */
@@ -2625,9 +2644,9 @@ diff -Nur linux-4.9.6.orig/arch/x86/platform/uv/uv_time.c linux-4.9.6/arch/x86/p
}
/*
-diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
---- linux-4.9.6.orig/block/blk-core.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/blk-core.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/blk-core.c linux-4.9.22/block/blk-core.c
+--- linux-4.9.22.orig/block/blk-core.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/blk-core.c 2017-04-18 17:19:16.634771367 +0200
@@ -125,6 +125,9 @@
INIT_LIST_HEAD(&rq->queuelist);
@@ -2674,7 +2693,7 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
/*
* Init percpu_ref in atomic mode so that it's faster to shutdown.
-@@ -3177,7 +3180,7 @@
+@@ -3200,7 +3203,7 @@
blk_run_queue_async(q);
else
__blk_run_queue(q);
@@ -2683,7 +2702,7 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
}
static void flush_plug_callbacks(struct blk_plug *plug, bool from_schedule)
-@@ -3225,7 +3228,6 @@
+@@ -3248,7 +3251,6 @@
void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
{
struct request_queue *q;
@@ -2691,7 +2710,7 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
struct request *rq;
LIST_HEAD(list);
unsigned int depth;
-@@ -3245,11 +3247,6 @@
+@@ -3268,11 +3270,6 @@
q = NULL;
depth = 0;
@@ -2703,7 +2722,7 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
while (!list_empty(&list)) {
rq = list_entry_rq(list.next);
list_del_init(&rq->queuelist);
-@@ -3262,7 +3259,7 @@
+@@ -3285,7 +3282,7 @@
queue_unplugged(q, depth, from_schedule);
q = rq->q;
depth = 0;
@@ -2712,7 +2731,7 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
}
/*
-@@ -3289,8 +3286,6 @@
+@@ -3312,8 +3309,6 @@
*/
if (q)
queue_unplugged(q, depth, from_schedule);
@@ -2721,9 +2740,9 @@ diff -Nur linux-4.9.6.orig/block/blk-core.c linux-4.9.6/block/blk-core.c
}
void blk_finish_plug(struct blk_plug *plug)
-diff -Nur linux-4.9.6.orig/block/blk-ioc.c linux-4.9.6/block/blk-ioc.c
---- linux-4.9.6.orig/block/blk-ioc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/blk-ioc.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/blk-ioc.c linux-4.9.22/block/blk-ioc.c
+--- linux-4.9.22.orig/block/blk-ioc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/blk-ioc.c 2017-04-18 17:19:16.634771367 +0200
@@ -7,6 +7,7 @@
#include <linux/bio.h>
#include <linux/blkdev.h>
@@ -2750,9 +2769,9 @@ diff -Nur linux-4.9.6.orig/block/blk-ioc.c linux-4.9.6/block/blk-ioc.c
goto retry;
}
}
-diff -Nur linux-4.9.6.orig/block/blk-mq.c linux-4.9.6/block/blk-mq.c
---- linux-4.9.6.orig/block/blk-mq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/blk-mq.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/blk-mq.c linux-4.9.22/block/blk-mq.c
+--- linux-4.9.22.orig/block/blk-mq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/blk-mq.c 2017-04-18 17:19:16.634771367 +0200
@@ -72,7 +72,7 @@
static void blk_mq_freeze_queue_wait(struct request_queue *q)
@@ -2843,7 +2862,7 @@ diff -Nur linux-4.9.6.orig/block/blk-mq.c linux-4.9.6/block/blk-mq.c
}
static void __blk_mq_complete_request(struct request *rq)
-@@ -915,14 +935,14 @@
+@@ -906,14 +926,14 @@
return;
if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) {
@@ -2861,9 +2880,9 @@ diff -Nur linux-4.9.6.orig/block/blk-mq.c linux-4.9.6/block/blk-mq.c
}
kblockd_schedule_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work);
-diff -Nur linux-4.9.6.orig/block/blk-mq.h linux-4.9.6/block/blk-mq.h
---- linux-4.9.6.orig/block/blk-mq.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/blk-mq.h 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/blk-mq.h linux-4.9.22/block/blk-mq.h
+--- linux-4.9.22.orig/block/blk-mq.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/blk-mq.h 2017-04-18 17:19:16.634771367 +0200
@@ -72,12 +72,12 @@
*/
static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q)
@@ -2879,9 +2898,9 @@ diff -Nur linux-4.9.6.orig/block/blk-mq.h linux-4.9.6/block/blk-mq.h
}
struct blk_mq_alloc_data {
-diff -Nur linux-4.9.6.orig/block/blk-softirq.c linux-4.9.6/block/blk-softirq.c
---- linux-4.9.6.orig/block/blk-softirq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/blk-softirq.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/blk-softirq.c linux-4.9.22/block/blk-softirq.c
+--- linux-4.9.22.orig/block/blk-softirq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/blk-softirq.c 2017-04-18 17:19:16.634771367 +0200
@@ -51,6 +51,7 @@
raise_softirq_irqoff(BLOCK_SOFTIRQ);
@@ -2906,9 +2925,9 @@ diff -Nur linux-4.9.6.orig/block/blk-softirq.c linux-4.9.6/block/blk-softirq.c
}
/**
-diff -Nur linux-4.9.6.orig/block/bounce.c linux-4.9.6/block/bounce.c
---- linux-4.9.6.orig/block/bounce.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/block/bounce.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/block/bounce.c linux-4.9.22/block/bounce.c
+--- linux-4.9.22.orig/block/bounce.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/block/bounce.c 2017-04-18 17:19:16.634771367 +0200
@@ -55,11 +55,11 @@
unsigned long flags;
unsigned char *vto;
@@ -2923,10 +2942,10 @@ diff -Nur linux-4.9.6.orig/block/bounce.c linux-4.9.6/block/bounce.c
}
#else /* CONFIG_HIGHMEM */
-diff -Nur linux-4.9.6.orig/crypto/algapi.c linux-4.9.6/crypto/algapi.c
---- linux-4.9.6.orig/crypto/algapi.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/crypto/algapi.c 2017-01-28 13:59:09.903655111 +0100
-@@ -718,13 +718,13 @@
+diff -Nur linux-4.9.22.orig/crypto/algapi.c linux-4.9.22/crypto/algapi.c
+--- linux-4.9.22.orig/crypto/algapi.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/crypto/algapi.c 2017-04-18 17:19:16.634771367 +0200
+@@ -719,13 +719,13 @@
int crypto_register_notifier(struct notifier_block *nb)
{
@@ -2942,9 +2961,9 @@ diff -Nur linux-4.9.6.orig/crypto/algapi.c linux-4.9.6/crypto/algapi.c
}
EXPORT_SYMBOL_GPL(crypto_unregister_notifier);
-diff -Nur linux-4.9.6.orig/crypto/api.c linux-4.9.6/crypto/api.c
---- linux-4.9.6.orig/crypto/api.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/crypto/api.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/crypto/api.c linux-4.9.22/crypto/api.c
+--- linux-4.9.22.orig/crypto/api.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/crypto/api.c 2017-04-18 17:19:16.634771367 +0200
@@ -31,7 +31,7 @@
DECLARE_RWSEM(crypto_alg_sem);
EXPORT_SYMBOL_GPL(crypto_alg_sem);
@@ -2967,9 +2986,9 @@ diff -Nur linux-4.9.6.orig/crypto/api.c linux-4.9.6/crypto/api.c
}
return ok;
-diff -Nur linux-4.9.6.orig/crypto/internal.h linux-4.9.6/crypto/internal.h
---- linux-4.9.6.orig/crypto/internal.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/crypto/internal.h 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/crypto/internal.h linux-4.9.22/crypto/internal.h
+--- linux-4.9.22.orig/crypto/internal.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/crypto/internal.h 2017-04-18 17:19:16.634771367 +0200
@@ -47,7 +47,7 @@
extern struct list_head crypto_alg_list;
@@ -2988,9 +3007,9 @@ diff -Nur linux-4.9.6.orig/crypto/internal.h linux-4.9.6/crypto/internal.h
}
#endif /* _CRYPTO_INTERNAL_H */
-diff -Nur linux-4.9.6.orig/Documentation/sysrq.txt linux-4.9.6/Documentation/sysrq.txt
---- linux-4.9.6.orig/Documentation/sysrq.txt 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/Documentation/sysrq.txt 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/Documentation/sysrq.txt linux-4.9.22/Documentation/sysrq.txt
+--- linux-4.9.22.orig/Documentation/sysrq.txt 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/Documentation/sysrq.txt 2017-04-18 17:19:16.618770722 +0200
@@ -59,10 +59,17 @@
On other - If you know of the key combos for other architectures, please
let me know so I can add them to this section.
@@ -3011,9 +3030,9 @@ diff -Nur linux-4.9.6.orig/Documentation/sysrq.txt linux-4.9.6/Documentation/sys
* What are the 'command' keys?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'b' - Will immediately reboot the system without syncing or unmounting
-diff -Nur linux-4.9.6.orig/Documentation/trace/histograms.txt linux-4.9.6/Documentation/trace/histograms.txt
---- linux-4.9.6.orig/Documentation/trace/histograms.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/Documentation/trace/histograms.txt 2017-01-28 13:59:09.887654498 +0100
+diff -Nur linux-4.9.22.orig/Documentation/trace/histograms.txt linux-4.9.22/Documentation/trace/histograms.txt
+--- linux-4.9.22.orig/Documentation/trace/histograms.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/Documentation/trace/histograms.txt 2017-04-18 17:19:16.618770722 +0200
@@ -0,0 +1,186 @@
+ Using the Linux Kernel Latency Histograms
+
@@ -3201,9 +3220,9 @@ diff -Nur linux-4.9.6.orig/Documentation/trace/histograms.txt linux-4.9.6/Docume
+is provided.
+
+These data are also reset when the wakeup histogram is reset.
-diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/acglobal.h linux-4.9.6/drivers/acpi/acpica/acglobal.h
---- linux-4.9.6.orig/drivers/acpi/acpica/acglobal.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/acpi/acpica/acglobal.h 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/drivers/acpi/acpica/acglobal.h linux-4.9.22/drivers/acpi/acpica/acglobal.h
+--- linux-4.9.22.orig/drivers/acpi/acpica/acglobal.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/acpi/acpica/acglobal.h 2017-04-18 17:19:16.634771367 +0200
@@ -116,7 +116,7 @@
* interrupt level
*/
@@ -3213,9 +3232,9 @@ diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/acglobal.h linux-4.9.6/drivers/ac
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_reference_count_lock);
/* Mutex for _OSI support */
-diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/hwregs.c linux-4.9.6/drivers/acpi/acpica/hwregs.c
---- linux-4.9.6.orig/drivers/acpi/acpica/hwregs.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/acpi/acpica/hwregs.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/drivers/acpi/acpica/hwregs.c linux-4.9.22/drivers/acpi/acpica/hwregs.c
+--- linux-4.9.22.orig/drivers/acpi/acpica/hwregs.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/acpi/acpica/hwregs.c 2017-04-18 17:19:16.634771367 +0200
@@ -363,14 +363,14 @@
ACPI_BITMASK_ALL_FIXED_STATUS,
ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address)));
@@ -3233,9 +3252,9 @@ diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/hwregs.c linux-4.9.6/drivers/acpi
if (ACPI_FAILURE(status)) {
goto exit;
-diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/hwxface.c linux-4.9.6/drivers/acpi/acpica/hwxface.c
---- linux-4.9.6.orig/drivers/acpi/acpica/hwxface.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/acpi/acpica/hwxface.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/drivers/acpi/acpica/hwxface.c linux-4.9.22/drivers/acpi/acpica/hwxface.c
+--- linux-4.9.22.orig/drivers/acpi/acpica/hwxface.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/acpi/acpica/hwxface.c 2017-04-18 17:19:16.634771367 +0200
@@ -373,7 +373,7 @@
return_ACPI_STATUS(AE_BAD_PARAMETER);
}
@@ -3254,9 +3273,9 @@ diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/hwxface.c linux-4.9.6/drivers/acp
return_ACPI_STATUS(status);
}
-diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/utmutex.c linux-4.9.6/drivers/acpi/acpica/utmutex.c
---- linux-4.9.6.orig/drivers/acpi/acpica/utmutex.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/acpi/acpica/utmutex.c 2017-01-28 13:59:09.903655111 +0100
+diff -Nur linux-4.9.22.orig/drivers/acpi/acpica/utmutex.c linux-4.9.22/drivers/acpi/acpica/utmutex.c
+--- linux-4.9.22.orig/drivers/acpi/acpica/utmutex.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/acpi/acpica/utmutex.c 2017-04-18 17:19:16.634771367 +0200
@@ -88,7 +88,7 @@
return_ACPI_STATUS (status);
}
@@ -3275,9 +3294,9 @@ diff -Nur linux-4.9.6.orig/drivers/acpi/acpica/utmutex.c linux-4.9.6/drivers/acp
acpi_os_delete_lock(acpi_gbl_reference_count_lock);
/* Delete the reader/writer lock */
-diff -Nur linux-4.9.6.orig/drivers/ata/libata-sff.c linux-4.9.6/drivers/ata/libata-sff.c
---- linux-4.9.6.orig/drivers/ata/libata-sff.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ata/libata-sff.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/ata/libata-sff.c linux-4.9.22/drivers/ata/libata-sff.c
+--- linux-4.9.22.orig/drivers/ata/libata-sff.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ata/libata-sff.c 2017-04-18 17:19:16.634771367 +0200
@@ -678,9 +678,9 @@
unsigned long flags;
unsigned int consumed;
@@ -3326,9 +3345,9 @@ diff -Nur linux-4.9.6.orig/drivers/ata/libata-sff.c linux-4.9.6/drivers/ata/liba
} else {
buf = page_address(page);
consumed = ap->ops->sff_data_xfer(dev, buf + offset,
-diff -Nur linux-4.9.6.orig/drivers/block/zram/zcomp.c linux-4.9.6/drivers/block/zram/zcomp.c
---- linux-4.9.6.orig/drivers/block/zram/zcomp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/block/zram/zcomp.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/block/zram/zcomp.c linux-4.9.22/drivers/block/zram/zcomp.c
+--- linux-4.9.22.orig/drivers/block/zram/zcomp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/block/zram/zcomp.c 2017-04-18 17:19:16.634771367 +0200
@@ -118,12 +118,19 @@
struct zcomp_strm *zcomp_stream_get(struct zcomp *comp)
@@ -3359,9 +3378,9 @@ diff -Nur linux-4.9.6.orig/drivers/block/zram/zcomp.c linux-4.9.6/drivers/block/
*per_cpu_ptr(comp->stream, cpu) = zstrm;
break;
case CPU_DEAD:
-diff -Nur linux-4.9.6.orig/drivers/block/zram/zcomp.h linux-4.9.6/drivers/block/zram/zcomp.h
---- linux-4.9.6.orig/drivers/block/zram/zcomp.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/block/zram/zcomp.h 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/block/zram/zcomp.h linux-4.9.22/drivers/block/zram/zcomp.h
+--- linux-4.9.22.orig/drivers/block/zram/zcomp.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/block/zram/zcomp.h 2017-04-18 17:19:16.634771367 +0200
@@ -14,6 +14,7 @@
/* compression/decompression buffer */
void *buffer;
@@ -3370,9 +3389,9 @@ diff -Nur linux-4.9.6.orig/drivers/block/zram/zcomp.h linux-4.9.6/drivers/block/
};
/* dynamic per-device compression frontend */
-diff -Nur linux-4.9.6.orig/drivers/block/zram/zram_drv.c linux-4.9.6/drivers/block/zram/zram_drv.c
---- linux-4.9.6.orig/drivers/block/zram/zram_drv.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/block/zram/zram_drv.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/block/zram/zram_drv.c linux-4.9.22/drivers/block/zram/zram_drv.c
+--- linux-4.9.22.orig/drivers/block/zram/zram_drv.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/block/zram/zram_drv.c 2017-04-18 17:19:16.638771524 +0200
@@ -528,6 +528,8 @@
goto out_error;
}
@@ -3487,9 +3506,9 @@ diff -Nur linux-4.9.6.orig/drivers/block/zram/zram_drv.c linux-4.9.6/drivers/blo
atomic64_inc(&zram->stats.notify_free);
}
-diff -Nur linux-4.9.6.orig/drivers/block/zram/zram_drv.h linux-4.9.6/drivers/block/zram/zram_drv.h
---- linux-4.9.6.orig/drivers/block/zram/zram_drv.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/block/zram/zram_drv.h 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/block/zram/zram_drv.h linux-4.9.22/drivers/block/zram/zram_drv.h
+--- linux-4.9.22.orig/drivers/block/zram/zram_drv.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/block/zram/zram_drv.h 2017-04-18 17:19:16.638771524 +0200
@@ -73,6 +73,9 @@
struct zram_table_entry {
unsigned long handle;
@@ -3543,9 +3562,9 @@ diff -Nur linux-4.9.6.orig/drivers/block/zram/zram_drv.h linux-4.9.6/drivers/blo
+#endif /* CONFIG_PREEMPT_RT_BASE */
+
#endif
-diff -Nur linux-4.9.6.orig/drivers/char/random.c linux-4.9.6/drivers/char/random.c
---- linux-4.9.6.orig/drivers/char/random.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/char/random.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/char/random.c linux-4.9.22/drivers/char/random.c
+--- linux-4.9.22.orig/drivers/char/random.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/char/random.c 2017-04-18 17:19:16.638771524 +0200
@@ -1028,8 +1028,6 @@
} sample;
long delta, delta2, delta3;
@@ -3597,9 +3616,9 @@ diff -Nur linux-4.9.6.orig/drivers/char/random.c linux-4.9.6/drivers/char/random
fast_mix(fast_pool);
add_interrupt_bench(cycles);
-diff -Nur linux-4.9.6.orig/drivers/clocksource/tcb_clksrc.c linux-4.9.6/drivers/clocksource/tcb_clksrc.c
---- linux-4.9.6.orig/drivers/clocksource/tcb_clksrc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/clocksource/tcb_clksrc.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/clocksource/tcb_clksrc.c linux-4.9.22/drivers/clocksource/tcb_clksrc.c
+--- linux-4.9.22.orig/drivers/clocksource/tcb_clksrc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/clocksource/tcb_clksrc.c 2017-04-18 17:19:16.638771524 +0200
@@ -23,8 +23,7 @@
* this 32 bit free-running counter. the second channel is not used.
*
@@ -3757,9 +3776,9 @@ diff -Nur linux-4.9.6.orig/drivers/clocksource/tcb_clksrc.c linux-4.9.6/drivers/
if (ret)
goto err_unregister_clksrc;
-diff -Nur linux-4.9.6.orig/drivers/clocksource/timer-atmel-pit.c linux-4.9.6/drivers/clocksource/timer-atmel-pit.c
---- linux-4.9.6.orig/drivers/clocksource/timer-atmel-pit.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/clocksource/timer-atmel-pit.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/clocksource/timer-atmel-pit.c linux-4.9.22/drivers/clocksource/timer-atmel-pit.c
+--- linux-4.9.22.orig/drivers/clocksource/timer-atmel-pit.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/clocksource/timer-atmel-pit.c 2017-04-18 17:19:16.638771524 +0200
@@ -46,6 +46,7 @@
u32 cycle;
u32 cnt;
@@ -3814,9 +3833,9 @@ diff -Nur linux-4.9.6.orig/drivers/clocksource/timer-atmel-pit.c linux-4.9.6/dri
/* Set up and register clockevents */
data->clkevt.name = "pit";
data->clkevt.features = CLOCK_EVT_FEAT_PERIODIC;
-diff -Nur linux-4.9.6.orig/drivers/clocksource/timer-atmel-st.c linux-4.9.6/drivers/clocksource/timer-atmel-st.c
---- linux-4.9.6.orig/drivers/clocksource/timer-atmel-st.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/clocksource/timer-atmel-st.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/clocksource/timer-atmel-st.c linux-4.9.22/drivers/clocksource/timer-atmel-st.c
+--- linux-4.9.22.orig/drivers/clocksource/timer-atmel-st.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/clocksource/timer-atmel-st.c 2017-04-18 17:19:16.638771524 +0200
@@ -115,18 +115,29 @@
last_crtr = read_CRTR();
}
@@ -3897,9 +3916,9 @@ diff -Nur linux-4.9.6.orig/drivers/clocksource/timer-atmel-st.c linux-4.9.6/driv
sclk = of_clk_get(node, 0);
if (IS_ERR(sclk)) {
pr_err("Unable to get slow clock\n");
-diff -Nur linux-4.9.6.orig/drivers/connector/cn_proc.c linux-4.9.6/drivers/connector/cn_proc.c
---- linux-4.9.6.orig/drivers/connector/cn_proc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/connector/cn_proc.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/connector/cn_proc.c linux-4.9.22/drivers/connector/cn_proc.c
+--- linux-4.9.22.orig/drivers/connector/cn_proc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/connector/cn_proc.c 2017-04-18 17:19:16.638771524 +0200
@@ -32,6 +32,7 @@
#include <linux/pid_namespace.h>
@@ -3930,9 +3949,9 @@ diff -Nur linux-4.9.6.orig/drivers/connector/cn_proc.c linux-4.9.6/drivers/conne
}
void proc_fork_connector(struct task_struct *task)
-diff -Nur linux-4.9.6.orig/drivers/cpufreq/Kconfig.x86 linux-4.9.6/drivers/cpufreq/Kconfig.x86
---- linux-4.9.6.orig/drivers/cpufreq/Kconfig.x86 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/cpufreq/Kconfig.x86 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/cpufreq/Kconfig.x86 linux-4.9.22/drivers/cpufreq/Kconfig.x86
+--- linux-4.9.22.orig/drivers/cpufreq/Kconfig.x86 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/cpufreq/Kconfig.x86 2017-04-18 17:19:16.638771524 +0200
@@ -124,7 +124,7 @@
config X86_POWERNOW_K8
@@ -3942,9 +3961,9 @@ diff -Nur linux-4.9.6.orig/drivers/cpufreq/Kconfig.x86 linux-4.9.6/drivers/cpufr
help
This adds the CPUFreq driver for K8/early Opteron/Athlon64 processors.
Support for K10 and newer processors is now in acpi-cpufreq.
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_execbuffer.c linux-4.9.6/drivers/gpu/drm/i915/i915_gem_execbuffer.c
---- linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_execbuffer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/i915/i915_gem_execbuffer.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/i915/i915_gem_execbuffer.c linux-4.9.22/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+--- linux-4.9.22.orig/drivers/gpu/drm/i915/i915_gem_execbuffer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/i915/i915_gem_execbuffer.c 2017-04-18 17:19:16.638771524 +0200
@@ -1537,7 +1537,9 @@
if (ret)
return ret;
@@ -3955,9 +3974,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_execbuffer.c linux-4.9.
i915_gem_execbuffer_move_to_active(vmas, params->request);
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_shrinker.c linux-4.9.6/drivers/gpu/drm/i915/i915_gem_shrinker.c
---- linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_shrinker.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/i915/i915_gem_shrinker.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/i915/i915_gem_shrinker.c linux-4.9.22/drivers/gpu/drm/i915/i915_gem_shrinker.c
+--- linux-4.9.22.orig/drivers/gpu/drm/i915/i915_gem_shrinker.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/i915/i915_gem_shrinker.c 2017-04-18 17:19:16.638771524 +0200
@@ -40,7 +40,7 @@
if (!mutex_is_locked(mutex))
return false;
@@ -3967,9 +3986,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_gem_shrinker.c linux-4.9.6/
return mutex->owner == task;
#else
/* Since UP may be pre-empted, we cannot assume that we own the lock */
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_irq.c linux-4.9.6/drivers/gpu/drm/i915/i915_irq.c
---- linux-4.9.6.orig/drivers/gpu/drm/i915/i915_irq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/i915/i915_irq.c 2017-01-28 13:59:09.907655265 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/i915/i915_irq.c linux-4.9.22/drivers/gpu/drm/i915/i915_irq.c
+--- linux-4.9.22.orig/drivers/gpu/drm/i915/i915_irq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/i915/i915_irq.c 2017-04-18 17:19:16.638771524 +0200
@@ -812,6 +812,7 @@
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
@@ -3986,10 +4005,10 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/i915_irq.c linux-4.9.6/drivers/g
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/intel_display.c linux-4.9.6/drivers/gpu/drm/i915/intel_display.c
---- linux-4.9.6.orig/drivers/gpu/drm/i915/intel_display.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/i915/intel_display.c 2017-01-28 13:59:09.911655420 +0100
-@@ -12131,7 +12131,7 @@
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/i915/intel_display.c linux-4.9.22/drivers/gpu/drm/i915/intel_display.c
+--- linux-4.9.22.orig/drivers/gpu/drm/i915/intel_display.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/i915/intel_display.c 2017-04-18 17:19:16.642771680 +0200
+@@ -12141,7 +12141,7 @@
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
struct intel_flip_work *work;
@@ -3998,9 +4017,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/intel_display.c linux-4.9.6/driv
if (crtc == NULL)
return;
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/intel_sprite.c linux-4.9.6/drivers/gpu/drm/i915/intel_sprite.c
---- linux-4.9.6.orig/drivers/gpu/drm/i915/intel_sprite.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/i915/intel_sprite.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/i915/intel_sprite.c linux-4.9.22/drivers/gpu/drm/i915/intel_sprite.c
+--- linux-4.9.22.orig/drivers/gpu/drm/i915/intel_sprite.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/i915/intel_sprite.c 2017-04-18 17:19:16.642771680 +0200
@@ -35,6 +35,7 @@
#include <drm/drm_rect.h>
#include <drm/drm_atomic.h>
@@ -4050,9 +4069,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/i915/intel_sprite.c linux-4.9.6/drive
if (crtc->debug.start_vbl_count &&
crtc->debug.start_vbl_count != end_vbl_count) {
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/msm/msm_gem_shrinker.c linux-4.9.6/drivers/gpu/drm/msm/msm_gem_shrinker.c
---- linux-4.9.6.orig/drivers/gpu/drm/msm/msm_gem_shrinker.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/msm/msm_gem_shrinker.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/msm/msm_gem_shrinker.c linux-4.9.22/drivers/gpu/drm/msm/msm_gem_shrinker.c
+--- linux-4.9.22.orig/drivers/gpu/drm/msm/msm_gem_shrinker.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/msm/msm_gem_shrinker.c 2017-04-18 17:19:16.642771680 +0200
@@ -23,7 +23,7 @@
if (!mutex_is_locked(mutex))
return false;
@@ -4062,9 +4081,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/msm/msm_gem_shrinker.c linux-4.9.6/dr
return mutex->owner == task;
#else
/* Since UP may be pre-empted, we cannot assume that we own the lock */
-diff -Nur linux-4.9.6.orig/drivers/gpu/drm/radeon/radeon_display.c linux-4.9.6/drivers/gpu/drm/radeon/radeon_display.c
---- linux-4.9.6.orig/drivers/gpu/drm/radeon/radeon_display.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/gpu/drm/radeon/radeon_display.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/gpu/drm/radeon/radeon_display.c linux-4.9.22/drivers/gpu/drm/radeon/radeon_display.c
+--- linux-4.9.22.orig/drivers/gpu/drm/radeon/radeon_display.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/gpu/drm/radeon/radeon_display.c 2017-04-18 17:19:16.642771680 +0200
@@ -1845,6 +1845,7 @@
struct radeon_device *rdev = dev->dev_private;
@@ -4081,9 +4100,9 @@ diff -Nur linux-4.9.6.orig/drivers/gpu/drm/radeon/radeon_display.c linux-4.9.6/d
/* Decode into vertical and horizontal scanout position. */
*vpos = position & 0x1fff;
-diff -Nur linux-4.9.6.orig/drivers/hv/vmbus_drv.c linux-4.9.6/drivers/hv/vmbus_drv.c
---- linux-4.9.6.orig/drivers/hv/vmbus_drv.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/hv/vmbus_drv.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/hv/vmbus_drv.c linux-4.9.22/drivers/hv/vmbus_drv.c
+--- linux-4.9.22.orig/drivers/hv/vmbus_drv.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/hv/vmbus_drv.c 2017-04-18 17:19:16.642771680 +0200
@@ -761,6 +761,8 @@
void *page_addr;
struct hv_message *msg;
@@ -4102,9 +4121,9 @@ diff -Nur linux-4.9.6.orig/drivers/hv/vmbus_drv.c linux-4.9.6/drivers/hv/vmbus_d
}
-diff -Nur linux-4.9.6.orig/drivers/ide/alim15x3.c linux-4.9.6/drivers/ide/alim15x3.c
---- linux-4.9.6.orig/drivers/ide/alim15x3.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/alim15x3.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/alim15x3.c linux-4.9.22/drivers/ide/alim15x3.c
+--- linux-4.9.22.orig/drivers/ide/alim15x3.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/alim15x3.c 2017-04-18 17:19:16.642771680 +0200
@@ -234,7 +234,7 @@
isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
@@ -4123,9 +4142,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/alim15x3.c linux-4.9.6/drivers/ide/alim15
return 0;
}
-diff -Nur linux-4.9.6.orig/drivers/ide/hpt366.c linux-4.9.6/drivers/ide/hpt366.c
---- linux-4.9.6.orig/drivers/ide/hpt366.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/hpt366.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/hpt366.c linux-4.9.22/drivers/ide/hpt366.c
+--- linux-4.9.22.orig/drivers/ide/hpt366.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/hpt366.c 2017-04-18 17:19:16.642771680 +0200
@@ -1236,7 +1236,7 @@
dma_old = inb(base + 2);
@@ -4144,9 +4163,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/hpt366.c linux-4.9.6/drivers/ide/hpt366.c
printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
hwif->name, base, base + 7);
-diff -Nur linux-4.9.6.orig/drivers/ide/ide-io.c linux-4.9.6/drivers/ide/ide-io.c
---- linux-4.9.6.orig/drivers/ide/ide-io.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/ide-io.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/ide-io.c linux-4.9.22/drivers/ide/ide-io.c
+--- linux-4.9.22.orig/drivers/ide/ide-io.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/ide-io.c 2017-04-18 17:19:16.642771680 +0200
@@ -659,7 +659,7 @@
/* disable_irq_nosync ?? */
disable_irq(hwif->irq);
@@ -4156,9 +4175,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/ide-io.c linux-4.9.6/drivers/ide/ide-io.c
if (hwif->polling) {
startstop = handler(drive);
} else if (drive_is_ready(drive)) {
-diff -Nur linux-4.9.6.orig/drivers/ide/ide-iops.c linux-4.9.6/drivers/ide/ide-iops.c
---- linux-4.9.6.orig/drivers/ide/ide-iops.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/ide-iops.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/ide-iops.c linux-4.9.22/drivers/ide/ide-iops.c
+--- linux-4.9.22.orig/drivers/ide/ide-iops.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/ide-iops.c 2017-04-18 17:19:16.642771680 +0200
@@ -129,12 +129,12 @@
if ((stat & ATA_BUSY) == 0)
break;
@@ -4174,9 +4193,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/ide-iops.c linux-4.9.6/drivers/ide/ide-io
}
/*
* Allow status to settle, then read it again.
-diff -Nur linux-4.9.6.orig/drivers/ide/ide-io-std.c linux-4.9.6/drivers/ide/ide-io-std.c
---- linux-4.9.6.orig/drivers/ide/ide-io-std.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/ide-io-std.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/ide-io-std.c linux-4.9.22/drivers/ide/ide-io-std.c
+--- linux-4.9.22.orig/drivers/ide/ide-io-std.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/ide-io-std.c 2017-04-18 17:19:16.642771680 +0200
@@ -175,7 +175,7 @@
unsigned long uninitialized_var(flags);
@@ -4213,9 +4232,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/ide-io-std.c linux-4.9.6/drivers/ide/ide-
if (((len + 1) & 3) < 2)
return;
-diff -Nur linux-4.9.6.orig/drivers/ide/ide-probe.c linux-4.9.6/drivers/ide/ide-probe.c
---- linux-4.9.6.orig/drivers/ide/ide-probe.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/ide-probe.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/ide-probe.c linux-4.9.22/drivers/ide/ide-probe.c
+--- linux-4.9.22.orig/drivers/ide/ide-probe.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/ide-probe.c 2017-04-18 17:19:16.642771680 +0200
@@ -196,10 +196,10 @@
int bswap = 1;
@@ -4229,9 +4248,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/ide-probe.c linux-4.9.6/drivers/ide/ide-p
drive->dev_flags |= IDE_DFLAG_ID_READ;
#ifdef DEBUG
-diff -Nur linux-4.9.6.orig/drivers/ide/ide-taskfile.c linux-4.9.6/drivers/ide/ide-taskfile.c
---- linux-4.9.6.orig/drivers/ide/ide-taskfile.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/ide/ide-taskfile.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/ide/ide-taskfile.c linux-4.9.22/drivers/ide/ide-taskfile.c
+--- linux-4.9.22.orig/drivers/ide/ide-taskfile.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/ide/ide-taskfile.c 2017-04-18 17:19:16.642771680 +0200
@@ -250,7 +250,7 @@
page_is_high = PageHighMem(page);
@@ -4259,9 +4278,9 @@ diff -Nur linux-4.9.6.orig/drivers/ide/ide-taskfile.c linux-4.9.6/drivers/ide/id
ide_set_handler(drive, &task_pio_intr, WAIT_WORSTCASE);
-diff -Nur linux-4.9.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c linux-4.9.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
---- linux-4.9.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2017-01-28 13:59:09.911655420 +0100
+diff -Nur linux-4.9.22.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c linux-4.9.22/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+--- linux-4.9.22.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2017-04-18 17:19:16.642771680 +0200
@@ -902,7 +902,7 @@
ipoib_dbg_mcast(priv, "restarting multicast task\n");
@@ -4280,9 +4299,9 @@ diff -Nur linux-4.9.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c linux-
/*
* make sure the in-flight joins have finished before we attempt
-diff -Nur linux-4.9.6.orig/drivers/input/gameport/gameport.c linux-4.9.6/drivers/input/gameport/gameport.c
---- linux-4.9.6.orig/drivers/input/gameport/gameport.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/input/gameport/gameport.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/input/gameport/gameport.c linux-4.9.22/drivers/input/gameport/gameport.c
+--- linux-4.9.22.orig/drivers/input/gameport/gameport.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/input/gameport/gameport.c 2017-04-18 17:19:16.642771680 +0200
@@ -91,13 +91,13 @@
tx = ~0;
@@ -4328,9 +4347,9 @@ diff -Nur linux-4.9.6.orig/drivers/input/gameport/gameport.c linux-4.9.6/drivers
udelay(i * 10);
if (t2 - t1 < tx) tx = t2 - t1;
}
-diff -Nur linux-4.9.6.orig/drivers/iommu/amd_iommu.c linux-4.9.6/drivers/iommu/amd_iommu.c
---- linux-4.9.6.orig/drivers/iommu/amd_iommu.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/iommu/amd_iommu.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/iommu/amd_iommu.c linux-4.9.22/drivers/iommu/amd_iommu.c
+--- linux-4.9.22.orig/drivers/iommu/amd_iommu.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/iommu/amd_iommu.c 2017-04-18 17:19:16.646771835 +0200
@@ -1923,10 +1923,10 @@
int ret;
@@ -4359,9 +4378,9 @@ diff -Nur linux-4.9.6.orig/drivers/iommu/amd_iommu.c linux-4.9.6/drivers/iommu/a
if (WARN_ON(!dev_data->domain))
return;
-diff -Nur linux-4.9.6.orig/drivers/iommu/intel-iommu.c linux-4.9.6/drivers/iommu/intel-iommu.c
---- linux-4.9.6.orig/drivers/iommu/intel-iommu.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/iommu/intel-iommu.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/iommu/intel-iommu.c linux-4.9.22/drivers/iommu/intel-iommu.c
+--- linux-4.9.22.orig/drivers/iommu/intel-iommu.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/iommu/intel-iommu.c 2017-04-18 17:19:16.646771835 +0200
@@ -479,7 +479,7 @@
struct deferred_flush_table *tables;
};
@@ -4371,7 +4390,7 @@ diff -Nur linux-4.9.6.orig/drivers/iommu/intel-iommu.c linux-4.9.6/drivers/iommu
/* bitmap for indexing intel_iommus */
static int g_num_of_iommus;
-@@ -3715,10 +3715,8 @@
+@@ -3716,10 +3716,8 @@
struct intel_iommu *iommu;
struct deferred_flush_entry *entry;
struct deferred_flush_data *flush_data;
@@ -4383,7 +4402,7 @@ diff -Nur linux-4.9.6.orig/drivers/iommu/intel-iommu.c linux-4.9.6/drivers/iommu
/* Flush all CPUs' entries to avoid deferring too much. If
* this becomes a bottleneck, can just flush us, and rely on
-@@ -3751,8 +3749,6 @@
+@@ -3752,8 +3750,6 @@
}
flush_data->size++;
spin_unlock_irqrestore(&flush_data->lock, flags);
@@ -4392,9 +4411,9 @@ diff -Nur linux-4.9.6.orig/drivers/iommu/intel-iommu.c linux-4.9.6/drivers/iommu
}
static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
-diff -Nur linux-4.9.6.orig/drivers/iommu/iova.c linux-4.9.6/drivers/iommu/iova.c
---- linux-4.9.6.orig/drivers/iommu/iova.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/iommu/iova.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/iommu/iova.c linux-4.9.22/drivers/iommu/iova.c
+--- linux-4.9.22.orig/drivers/iommu/iova.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/iommu/iova.c 2017-04-18 17:19:16.646771835 +0200
@@ -22,6 +22,7 @@
#include <linux/slab.h>
#include <linux/smp.h>
@@ -4448,9 +4467,9 @@ diff -Nur linux-4.9.6.orig/drivers/iommu/iova.c linux-4.9.6/drivers/iommu/iova.c
return iova_pfn;
}
-diff -Nur linux-4.9.6.orig/drivers/leds/trigger/Kconfig linux-4.9.6/drivers/leds/trigger/Kconfig
---- linux-4.9.6.orig/drivers/leds/trigger/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/leds/trigger/Kconfig 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/leds/trigger/Kconfig linux-4.9.22/drivers/leds/trigger/Kconfig
+--- linux-4.9.22.orig/drivers/leds/trigger/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/leds/trigger/Kconfig 2017-04-18 17:19:16.646771835 +0200
@@ -69,7 +69,7 @@
config LEDS_TRIGGER_CPU
@@ -4460,9 +4479,9 @@ diff -Nur linux-4.9.6.orig/drivers/leds/trigger/Kconfig linux-4.9.6/drivers/leds
help
This allows LEDs to be controlled by active CPUs. This shows
the active CPUs across an array of LEDs so you can see which
-diff -Nur linux-4.9.6.orig/drivers/md/bcache/Kconfig linux-4.9.6/drivers/md/bcache/Kconfig
---- linux-4.9.6.orig/drivers/md/bcache/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/md/bcache/Kconfig 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/md/bcache/Kconfig linux-4.9.22/drivers/md/bcache/Kconfig
+--- linux-4.9.22.orig/drivers/md/bcache/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/md/bcache/Kconfig 2017-04-18 17:19:16.646771835 +0200
@@ -1,6 +1,7 @@
config BCACHE
@@ -4471,10 +4490,10 @@ diff -Nur linux-4.9.6.orig/drivers/md/bcache/Kconfig linux-4.9.6/drivers/md/bcac
---help---
Allows a block device to be used as cache for other devices; uses
a btree for indexing and the layout is optimized for SSDs.
-diff -Nur linux-4.9.6.orig/drivers/md/dm-rq.c linux-4.9.6/drivers/md/dm-rq.c
---- linux-4.9.6.orig/drivers/md/dm-rq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/md/dm-rq.c 2017-01-28 13:59:09.915655573 +0100
-@@ -838,7 +838,7 @@
+diff -Nur linux-4.9.22.orig/drivers/md/dm-rq.c linux-4.9.22/drivers/md/dm-rq.c
+--- linux-4.9.22.orig/drivers/md/dm-rq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/md/dm-rq.c 2017-04-18 17:19:16.646771835 +0200
+@@ -842,7 +842,7 @@
/* Establish tio->ti before queuing work (map_tio_request) */
tio->ti = ti;
kthread_queue_work(&md->kworker, &tio->work);
@@ -4483,9 +4502,9 @@ diff -Nur linux-4.9.6.orig/drivers/md/dm-rq.c linux-4.9.6/drivers/md/dm-rq.c
}
}
-diff -Nur linux-4.9.6.orig/drivers/md/raid5.c linux-4.9.6/drivers/md/raid5.c
---- linux-4.9.6.orig/drivers/md/raid5.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/md/raid5.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/md/raid5.c linux-4.9.22/drivers/md/raid5.c
+--- linux-4.9.22.orig/drivers/md/raid5.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/md/raid5.c 2017-04-18 17:19:16.646771835 +0200
@@ -1928,8 +1928,9 @@
struct raid5_percpu *percpu;
unsigned long cpu;
@@ -4523,9 +4542,9 @@ diff -Nur linux-4.9.6.orig/drivers/md/raid5.c linux-4.9.6/drivers/md/raid5.c
err = cpuhp_state_add_instance(CPUHP_MD_RAID5_PREPARE, &conf->node);
if (!err) {
conf->scribble_disks = max(conf->raid_disks,
-diff -Nur linux-4.9.6.orig/drivers/md/raid5.h linux-4.9.6/drivers/md/raid5.h
---- linux-4.9.6.orig/drivers/md/raid5.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/md/raid5.h 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/md/raid5.h linux-4.9.22/drivers/md/raid5.h
+--- linux-4.9.22.orig/drivers/md/raid5.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/md/raid5.h 2017-04-18 17:19:16.646771835 +0200
@@ -504,6 +504,7 @@
int recovery_disabled;
/* per cpu variables */
@@ -4534,9 +4553,9 @@ diff -Nur linux-4.9.6.orig/drivers/md/raid5.h linux-4.9.6/drivers/md/raid5.h
struct page *spare_page; /* Used when checking P/Q in raid6 */
struct flex_array *scribble; /* space for constructing buffer
* lists and performing address
-diff -Nur linux-4.9.6.orig/drivers/misc/Kconfig linux-4.9.6/drivers/misc/Kconfig
---- linux-4.9.6.orig/drivers/misc/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/misc/Kconfig 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/misc/Kconfig linux-4.9.22/drivers/misc/Kconfig
+--- linux-4.9.22.orig/drivers/misc/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/misc/Kconfig 2017-04-18 17:19:16.646771835 +0200
@@ -54,6 +54,7 @@
config ATMEL_TCLIB
bool "Atmel AT32/AT91 Timer/Counter Library"
@@ -4571,9 +4590,9 @@ diff -Nur linux-4.9.6.orig/drivers/misc/Kconfig linux-4.9.6/drivers/misc/Kconfig
config DUMMY_IRQ
tristate "Dummy IRQ handler"
default n
-diff -Nur linux-4.9.6.orig/drivers/mmc/host/mmci.c linux-4.9.6/drivers/mmc/host/mmci.c
---- linux-4.9.6.orig/drivers/mmc/host/mmci.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/mmc/host/mmci.c 2017-01-28 13:59:09.915655573 +0100
+diff -Nur linux-4.9.22.orig/drivers/mmc/host/mmci.c linux-4.9.22/drivers/mmc/host/mmci.c
+--- linux-4.9.22.orig/drivers/mmc/host/mmci.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/mmc/host/mmci.c 2017-04-18 17:19:16.646771835 +0200
@@ -1147,15 +1147,12 @@
struct sg_mapping_iter *sg_miter = &host->sg_miter;
struct variant_data *variant = host->variant;
@@ -4599,9 +4618,9 @@ diff -Nur linux-4.9.6.orig/drivers/mmc/host/mmci.c linux-4.9.6/drivers/mmc/host/
/*
* If we have less than the fifo 'half-full' threshold to transfer,
* trigger a PIO interrupt as soon as any data is available.
-diff -Nur linux-4.9.6.orig/drivers/net/ethernet/3com/3c59x.c linux-4.9.6/drivers/net/ethernet/3com/3c59x.c
---- linux-4.9.6.orig/drivers/net/ethernet/3com/3c59x.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/net/ethernet/3com/3c59x.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/net/ethernet/3com/3c59x.c linux-4.9.22/drivers/net/ethernet/3com/3c59x.c
+--- linux-4.9.22.orig/drivers/net/ethernet/3com/3c59x.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/net/ethernet/3com/3c59x.c 2017-04-18 17:19:16.646771835 +0200
@@ -842,9 +842,9 @@
{
struct vortex_private *vp = netdev_priv(dev);
@@ -4629,9 +4648,9 @@ diff -Nur linux-4.9.6.orig/drivers/net/ethernet/3com/3c59x.c linux-4.9.6/drivers
}
}
-diff -Nur linux-4.9.6.orig/drivers/net/ethernet/realtek/8139too.c linux-4.9.6/drivers/net/ethernet/realtek/8139too.c
---- linux-4.9.6.orig/drivers/net/ethernet/realtek/8139too.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/net/ethernet/realtek/8139too.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/net/ethernet/realtek/8139too.c linux-4.9.22/drivers/net/ethernet/realtek/8139too.c
+--- linux-4.9.22.orig/drivers/net/ethernet/realtek/8139too.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/net/ethernet/realtek/8139too.c 2017-04-18 17:19:16.650771990 +0200
@@ -2233,7 +2233,7 @@
struct rtl8139_private *tp = netdev_priv(dev);
const int irq = tp->pci_dev->irq;
@@ -4641,9 +4660,9 @@ diff -Nur linux-4.9.6.orig/drivers/net/ethernet/realtek/8139too.c linux-4.9.6/dr
rtl8139_interrupt(irq, dev);
enable_irq(irq);
}
-diff -Nur linux-4.9.6.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c linux-4.9.6/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
---- linux-4.9.6.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c linux-4.9.22/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
+--- linux-4.9.22.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2017-04-18 17:19:16.650771990 +0200
@@ -697,7 +697,7 @@
while (!ctx->done.done && msecs--)
udelay(1000);
@@ -4653,9 +4672,9 @@ diff -Nur linux-4.9.6.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c l
ctx->done.done);
}
break;
-diff -Nur linux-4.9.6.orig/drivers/pci/access.c linux-4.9.6/drivers/pci/access.c
---- linux-4.9.6.orig/drivers/pci/access.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/pci/access.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/pci/access.c linux-4.9.22/drivers/pci/access.c
+--- linux-4.9.22.orig/drivers/pci/access.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/pci/access.c 2017-04-18 17:19:16.650771990 +0200
@@ -672,7 +672,7 @@
WARN_ON(!dev->block_cfg_access);
@@ -4665,9 +4684,217 @@ diff -Nur linux-4.9.6.orig/drivers/pci/access.c linux-4.9.6/drivers/pci/access.c
raw_spin_unlock_irqrestore(&pci_lock, flags);
}
EXPORT_SYMBOL_GPL(pci_cfg_access_unlock);
-diff -Nur linux-4.9.6.orig/drivers/scsi/fcoe/fcoe.c linux-4.9.6/drivers/scsi/fcoe/fcoe.c
---- linux-4.9.6.orig/drivers/scsi/fcoe/fcoe.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/fcoe/fcoe.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/pinctrl/qcom/pinctrl-msm.c linux-4.9.22/drivers/pinctrl/qcom/pinctrl-msm.c
+--- linux-4.9.22.orig/drivers/pinctrl/qcom/pinctrl-msm.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/pinctrl/qcom/pinctrl-msm.c 2017-04-18 17:19:16.650771990 +0200
+@@ -61,7 +61,7 @@
+ struct notifier_block restart_nb;
+ int irq;
+
+- spinlock_t lock;
++ raw_spinlock_t lock;
+
+ DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
+ DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
+@@ -153,14 +153,14 @@
+ if (WARN_ON(i == g->nfuncs))
+ return -EINVAL;
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->ctl_reg);
+ val &= ~mask;
+ val |= i << g->mux_bit;
+ writel(val, pctrl->regs + g->ctl_reg);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ return 0;
+ }
+@@ -323,14 +323,14 @@
+ break;
+ case PIN_CONFIG_OUTPUT:
+ /* set output value */
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+ val = readl(pctrl->regs + g->io_reg);
+ if (arg)
+ val |= BIT(g->out_bit);
+ else
+ val &= ~BIT(g->out_bit);
+ writel(val, pctrl->regs + g->io_reg);
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ /* enable output */
+ arg = 1;
+@@ -351,12 +351,12 @@
+ return -EINVAL;
+ }
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+ val = readl(pctrl->regs + g->ctl_reg);
+ val &= ~(mask << bit);
+ val |= arg << bit;
+ writel(val, pctrl->regs + g->ctl_reg);
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+ }
+
+ return 0;
+@@ -384,13 +384,13 @@
+
+ g = &pctrl->soc->groups[offset];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->ctl_reg);
+ val &= ~BIT(g->oe_bit);
+ writel(val, pctrl->regs + g->ctl_reg);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ return 0;
+ }
+@@ -404,7 +404,7 @@
+
+ g = &pctrl->soc->groups[offset];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->io_reg);
+ if (value)
+@@ -417,7 +417,7 @@
+ val |= BIT(g->oe_bit);
+ writel(val, pctrl->regs + g->ctl_reg);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ return 0;
+ }
+@@ -443,7 +443,7 @@
+
+ g = &pctrl->soc->groups[offset];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->io_reg);
+ if (value)
+@@ -452,7 +452,7 @@
+ val &= ~BIT(g->out_bit);
+ writel(val, pctrl->regs + g->io_reg);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+ }
+
+ #ifdef CONFIG_DEBUG_FS
+@@ -571,7 +571,7 @@
+
+ g = &pctrl->soc->groups[d->hwirq];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->intr_cfg_reg);
+ val &= ~BIT(g->intr_enable_bit);
+@@ -579,7 +579,7 @@
+
+ clear_bit(d->hwirq, pctrl->enabled_irqs);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+ }
+
+ static void msm_gpio_irq_unmask(struct irq_data *d)
+@@ -592,7 +592,7 @@
+
+ g = &pctrl->soc->groups[d->hwirq];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->intr_cfg_reg);
+ val |= BIT(g->intr_enable_bit);
+@@ -600,7 +600,7 @@
+
+ set_bit(d->hwirq, pctrl->enabled_irqs);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+ }
+
+ static void msm_gpio_irq_ack(struct irq_data *d)
+@@ -613,7 +613,7 @@
+
+ g = &pctrl->soc->groups[d->hwirq];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ val = readl(pctrl->regs + g->intr_status_reg);
+ if (g->intr_ack_high)
+@@ -625,7 +625,7 @@
+ if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
+ msm_gpio_update_dual_edge_pos(pctrl, g, d);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+ }
+
+ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
+@@ -638,7 +638,7 @@
+
+ g = &pctrl->soc->groups[d->hwirq];
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ /*
+ * For hw without possibility of detecting both edges
+@@ -712,7 +712,7 @@
+ if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
+ msm_gpio_update_dual_edge_pos(pctrl, g, d);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
+ irq_set_handler_locked(d, handle_level_irq);
+@@ -728,11 +728,11 @@
+ struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
+ unsigned long flags;
+
+- spin_lock_irqsave(&pctrl->lock, flags);
++ raw_spin_lock_irqsave(&pctrl->lock, flags);
+
+ irq_set_irq_wake(pctrl->irq, on);
+
+- spin_unlock_irqrestore(&pctrl->lock, flags);
++ raw_spin_unlock_irqrestore(&pctrl->lock, flags);
+
+ return 0;
+ }
+@@ -878,7 +878,7 @@
+ pctrl->soc = soc_data;
+ pctrl->chip = msm_gpio_template;
+
+- spin_lock_init(&pctrl->lock);
++ raw_spin_lock_init(&pctrl->lock);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ pctrl->regs = devm_ioremap_resource(&pdev->dev, res);
+diff -Nur linux-4.9.22.orig/drivers/scsi/fcoe/fcoe.c linux-4.9.22/drivers/scsi/fcoe/fcoe.c
+--- linux-4.9.22.orig/drivers/scsi/fcoe/fcoe.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/fcoe/fcoe.c 2017-04-18 17:19:16.650771990 +0200
@@ -1455,11 +1455,11 @@
static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen)
{
@@ -4722,9 +4949,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/fcoe/fcoe.c linux-4.9.6/drivers/scsi/fco
kfree_skb(skb);
}
-diff -Nur linux-4.9.6.orig/drivers/scsi/fcoe/fcoe_ctlr.c linux-4.9.6/drivers/scsi/fcoe/fcoe_ctlr.c
---- linux-4.9.6.orig/drivers/scsi/fcoe/fcoe_ctlr.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/fcoe/fcoe_ctlr.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/scsi/fcoe/fcoe_ctlr.c linux-4.9.22/drivers/scsi/fcoe/fcoe_ctlr.c
+--- linux-4.9.22.orig/drivers/scsi/fcoe/fcoe_ctlr.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/fcoe/fcoe_ctlr.c 2017-04-18 17:19:16.650771990 +0200
@@ -834,7 +834,7 @@
INIT_LIST_HEAD(&del_list);
@@ -4743,9 +4970,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/fcoe/fcoe_ctlr.c linux-4.9.6/drivers/scs
list_for_each_entry_safe(fcf, next, &del_list, list) {
/* Removes fcf from current list */
-diff -Nur linux-4.9.6.orig/drivers/scsi/libfc/fc_exch.c linux-4.9.6/drivers/scsi/libfc/fc_exch.c
---- linux-4.9.6.orig/drivers/scsi/libfc/fc_exch.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/libfc/fc_exch.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/scsi/libfc/fc_exch.c linux-4.9.22/drivers/scsi/libfc/fc_exch.c
+--- linux-4.9.22.orig/drivers/scsi/libfc/fc_exch.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/libfc/fc_exch.c 2017-04-18 17:19:16.650771990 +0200
@@ -814,10 +814,10 @@
}
memset(ep, 0, sizeof(*ep));
@@ -4759,9 +4986,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/libfc/fc_exch.c linux-4.9.6/drivers/scsi
/* peek cache of free slot */
if (pool->left != FC_XID_UNKNOWN) {
-diff -Nur linux-4.9.6.orig/drivers/scsi/libsas/sas_ata.c linux-4.9.6/drivers/scsi/libsas/sas_ata.c
---- linux-4.9.6.orig/drivers/scsi/libsas/sas_ata.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/libsas/sas_ata.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/scsi/libsas/sas_ata.c linux-4.9.22/drivers/scsi/libsas/sas_ata.c
+--- linux-4.9.22.orig/drivers/scsi/libsas/sas_ata.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/libsas/sas_ata.c 2017-04-18 17:19:16.650771990 +0200
@@ -190,7 +190,7 @@
/* TODO: audit callers to ensure they are ready for qc_issue to
* unconditionally re-enable interrupts
@@ -4780,9 +5007,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/libsas/sas_ata.c linux-4.9.6/drivers/scs
return ret;
}
-diff -Nur linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_inline.h linux-4.9.6/drivers/scsi/qla2xxx/qla_inline.h
---- linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_inline.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/qla2xxx/qla_inline.h 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/scsi/qla2xxx/qla_inline.h linux-4.9.22/drivers/scsi/qla2xxx/qla_inline.h
+--- linux-4.9.22.orig/drivers/scsi/qla2xxx/qla_inline.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/qla2xxx/qla_inline.h 2017-04-18 17:19:16.650771990 +0200
@@ -59,12 +59,12 @@
{
unsigned long flags;
@@ -4798,9 +5025,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_inline.h linux-4.9.6/drivers
}
static inline uint8_t *
-diff -Nur linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_isr.c linux-4.9.6/drivers/scsi/qla2xxx/qla_isr.c
---- linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_isr.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/scsi/qla2xxx/qla_isr.c 2017-01-28 13:59:09.919655726 +0100
+diff -Nur linux-4.9.22.orig/drivers/scsi/qla2xxx/qla_isr.c linux-4.9.22/drivers/scsi/qla2xxx/qla_isr.c
+--- linux-4.9.22.orig/drivers/scsi/qla2xxx/qla_isr.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/scsi/qla2xxx/qla_isr.c 2017-04-18 17:19:16.650771990 +0200
@@ -3125,7 +3125,11 @@
* kref_put().
*/
@@ -4813,9 +5040,9 @@ diff -Nur linux-4.9.6.orig/drivers/scsi/qla2xxx/qla_isr.c linux-4.9.6/drivers/sc
}
/*
-diff -Nur linux-4.9.6.orig/drivers/thermal/x86_pkg_temp_thermal.c linux-4.9.6/drivers/thermal/x86_pkg_temp_thermal.c
---- linux-4.9.6.orig/drivers/thermal/x86_pkg_temp_thermal.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/thermal/x86_pkg_temp_thermal.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/thermal/x86_pkg_temp_thermal.c linux-4.9.22/drivers/thermal/x86_pkg_temp_thermal.c
+--- linux-4.9.22.orig/drivers/thermal/x86_pkg_temp_thermal.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/thermal/x86_pkg_temp_thermal.c 2017-04-18 17:19:16.650771990 +0200
@@ -29,6 +29,7 @@
#include <linux/pm.h>
#include <linux/thermal.h>
@@ -4918,9 +5145,9 @@ diff -Nur linux-4.9.6.orig/drivers/thermal/x86_pkg_temp_thermal.c linux-4.9.6/dr
for_each_online_cpu(i)
cancel_delayed_work_sync(
&per_cpu(pkg_temp_thermal_threshold_work, i));
-diff -Nur linux-4.9.6.orig/drivers/tty/serial/8250/8250_core.c linux-4.9.6/drivers/tty/serial/8250/8250_core.c
---- linux-4.9.6.orig/drivers/tty/serial/8250/8250_core.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/tty/serial/8250/8250_core.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/tty/serial/8250/8250_core.c linux-4.9.22/drivers/tty/serial/8250/8250_core.c
+--- linux-4.9.22.orig/drivers/tty/serial/8250/8250_core.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/tty/serial/8250/8250_core.c 2017-04-18 17:19:16.650771990 +0200
@@ -58,7 +58,16 @@
static unsigned int skip_txen_test; /* force skip of txen test at init time */
@@ -4939,9 +5166,9 @@ diff -Nur linux-4.9.6.orig/drivers/tty/serial/8250/8250_core.c linux-4.9.6/drive
#include <asm/serial.h>
/*
-diff -Nur linux-4.9.6.orig/drivers/tty/serial/8250/8250_port.c linux-4.9.6/drivers/tty/serial/8250/8250_port.c
---- linux-4.9.6.orig/drivers/tty/serial/8250/8250_port.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/tty/serial/8250/8250_port.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/tty/serial/8250/8250_port.c linux-4.9.22/drivers/tty/serial/8250/8250_port.c
+--- linux-4.9.22.orig/drivers/tty/serial/8250/8250_port.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/tty/serial/8250/8250_port.c 2017-04-18 17:19:16.650771990 +0200
@@ -35,6 +35,7 @@
#include <linux/nmi.h>
#include <linux/mutex.h>
@@ -4962,9 +5189,9 @@ diff -Nur linux-4.9.6.orig/drivers/tty/serial/8250/8250_port.c linux-4.9.6/drive
locked = spin_trylock_irqsave(&port->lock, flags);
else
spin_lock_irqsave(&port->lock, flags);
-diff -Nur linux-4.9.6.orig/drivers/tty/serial/amba-pl011.c linux-4.9.6/drivers/tty/serial/amba-pl011.c
---- linux-4.9.6.orig/drivers/tty/serial/amba-pl011.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/tty/serial/amba-pl011.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/tty/serial/amba-pl011.c linux-4.9.22/drivers/tty/serial/amba-pl011.c
+--- linux-4.9.22.orig/drivers/tty/serial/amba-pl011.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/tty/serial/amba-pl011.c 2017-04-18 17:19:16.654772144 +0200
@@ -2194,13 +2194,19 @@
clk_enable(uap->clk);
@@ -4998,9 +5225,9 @@ diff -Nur linux-4.9.6.orig/drivers/tty/serial/amba-pl011.c linux-4.9.6/drivers/t
clk_disable(uap->clk);
}
-diff -Nur linux-4.9.6.orig/drivers/tty/serial/omap-serial.c linux-4.9.6/drivers/tty/serial/omap-serial.c
---- linux-4.9.6.orig/drivers/tty/serial/omap-serial.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/tty/serial/omap-serial.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/tty/serial/omap-serial.c linux-4.9.22/drivers/tty/serial/omap-serial.c
+--- linux-4.9.22.orig/drivers/tty/serial/omap-serial.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/tty/serial/omap-serial.c 2017-04-18 17:19:16.654772144 +0200
@@ -1257,13 +1257,10 @@
pm_runtime_get_sync(up->dev);
@@ -5028,10 +5255,10 @@ diff -Nur linux-4.9.6.orig/drivers/tty/serial/omap-serial.c linux-4.9.6/drivers/
}
static int __init
-diff -Nur linux-4.9.6.orig/drivers/usb/core/hcd.c linux-4.9.6/drivers/usb/core/hcd.c
---- linux-4.9.6.orig/drivers/usb/core/hcd.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/usb/core/hcd.c 2017-01-28 13:59:09.923655879 +0100
-@@ -1761,9 +1761,9 @@
+diff -Nur linux-4.9.22.orig/drivers/usb/core/hcd.c linux-4.9.22/drivers/usb/core/hcd.c
+--- linux-4.9.22.orig/drivers/usb/core/hcd.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/usb/core/hcd.c 2017-04-18 17:19:16.654772144 +0200
+@@ -1764,9 +1764,9 @@
* and no one may trigger the above deadlock situation when
* running complete() in tasklet.
*/
@@ -5043,9 +5270,9 @@ diff -Nur linux-4.9.6.orig/drivers/usb/core/hcd.c linux-4.9.6/drivers/usb/core/h
usb_anchor_resume_wakeups(anchor);
atomic_dec(&urb->use_count);
-diff -Nur linux-4.9.6.orig/drivers/usb/gadget/function/f_fs.c linux-4.9.6/drivers/usb/gadget/function/f_fs.c
---- linux-4.9.6.orig/drivers/usb/gadget/function/f_fs.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/usb/gadget/function/f_fs.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/usb/gadget/function/f_fs.c linux-4.9.22/drivers/usb/gadget/function/f_fs.c
+--- linux-4.9.22.orig/drivers/usb/gadget/function/f_fs.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/usb/gadget/function/f_fs.c 2017-04-18 17:19:16.654772144 +0200
@@ -1593,7 +1593,7 @@
pr_info("%s(): freeing\n", __func__);
ffs_data_clear(ffs);
@@ -5055,9 +5282,9 @@ diff -Nur linux-4.9.6.orig/drivers/usb/gadget/function/f_fs.c linux-4.9.6/driver
kfree(ffs->dev_name);
kfree(ffs);
}
-diff -Nur linux-4.9.6.orig/drivers/usb/gadget/legacy/inode.c linux-4.9.6/drivers/usb/gadget/legacy/inode.c
---- linux-4.9.6.orig/drivers/usb/gadget/legacy/inode.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/drivers/usb/gadget/legacy/inode.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/drivers/usb/gadget/legacy/inode.c linux-4.9.22/drivers/usb/gadget/legacy/inode.c
+--- linux-4.9.22.orig/drivers/usb/gadget/legacy/inode.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/drivers/usb/gadget/legacy/inode.c 2017-04-18 17:19:16.654772144 +0200
@@ -346,7 +346,7 @@
spin_unlock_irq (&epdata->dev->lock);
@@ -5076,9 +5303,9 @@ diff -Nur linux-4.9.6.orig/drivers/usb/gadget/legacy/inode.c linux-4.9.6/drivers
if (epdata->status == -ECONNRESET)
epdata->status = -EINTR;
} else {
-diff -Nur linux-4.9.6.orig/fs/aio.c linux-4.9.6/fs/aio.c
---- linux-4.9.6.orig/fs/aio.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/aio.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/fs/aio.c linux-4.9.22/fs/aio.c
+--- linux-4.9.22.orig/fs/aio.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/aio.c 2017-04-18 17:19:16.654772144 +0200
@@ -40,6 +40,7 @@
#include <linux/ramfs.h>
#include <linux/percpu-refcount.h>
@@ -5154,9 +5381,9 @@ diff -Nur linux-4.9.6.orig/fs/aio.c linux-4.9.6/fs/aio.c
static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
{
unsigned i, new_nr;
-diff -Nur linux-4.9.6.orig/fs/autofs4/autofs_i.h linux-4.9.6/fs/autofs4/autofs_i.h
---- linux-4.9.6.orig/fs/autofs4/autofs_i.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/autofs4/autofs_i.h 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/fs/autofs4/autofs_i.h linux-4.9.22/fs/autofs4/autofs_i.h
+--- linux-4.9.22.orig/fs/autofs4/autofs_i.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/autofs4/autofs_i.h 2017-04-18 17:19:16.654772144 +0200
@@ -31,6 +31,7 @@
#include <linux/sched.h>
#include <linux/mount.h>
@@ -5165,9 +5392,9 @@ diff -Nur linux-4.9.6.orig/fs/autofs4/autofs_i.h linux-4.9.6/fs/autofs4/autofs_i
#include <asm/current.h>
#include <linux/uaccess.h>
-diff -Nur linux-4.9.6.orig/fs/autofs4/expire.c linux-4.9.6/fs/autofs4/expire.c
---- linux-4.9.6.orig/fs/autofs4/expire.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/autofs4/expire.c 2017-01-28 13:59:09.923655879 +0100
+diff -Nur linux-4.9.22.orig/fs/autofs4/expire.c linux-4.9.22/fs/autofs4/expire.c
+--- linux-4.9.22.orig/fs/autofs4/expire.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/autofs4/expire.c 2017-04-18 17:19:16.654772144 +0200
@@ -148,7 +148,7 @@
parent = p->d_parent;
if (!spin_trylock(&parent->d_lock)) {
@@ -5177,9 +5404,9 @@ diff -Nur linux-4.9.6.orig/fs/autofs4/expire.c linux-4.9.6/fs/autofs4/expire.c
goto relock;
}
spin_unlock(&p->d_lock);
-diff -Nur linux-4.9.6.orig/fs/buffer.c linux-4.9.6/fs/buffer.c
---- linux-4.9.6.orig/fs/buffer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/buffer.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/buffer.c linux-4.9.22/fs/buffer.c
+--- linux-4.9.22.orig/fs/buffer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/buffer.c 2017-04-18 17:19:16.654772144 +0200
@@ -301,8 +301,7 @@
* decide that the page is now completely done.
*/
@@ -5247,9 +5474,9 @@ diff -Nur linux-4.9.6.orig/fs/buffer.c linux-4.9.6/fs/buffer.c
preempt_disable();
__this_cpu_inc(bh_accounting.nr);
recalc_bh_state();
-diff -Nur linux-4.9.6.orig/fs/cifs/readdir.c linux-4.9.6/fs/cifs/readdir.c
---- linux-4.9.6.orig/fs/cifs/readdir.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/cifs/readdir.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/cifs/readdir.c linux-4.9.22/fs/cifs/readdir.c
+--- linux-4.9.22.orig/fs/cifs/readdir.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/cifs/readdir.c 2017-04-18 17:19:16.654772144 +0200
@@ -80,7 +80,7 @@
struct inode *inode;
struct super_block *sb = parent->d_sb;
@@ -5259,9 +5486,9 @@ diff -Nur linux-4.9.6.orig/fs/cifs/readdir.c linux-4.9.6/fs/cifs/readdir.c
cifs_dbg(FYI, "%s: for %s\n", __func__, name->name);
-diff -Nur linux-4.9.6.orig/fs/dcache.c linux-4.9.6/fs/dcache.c
---- linux-4.9.6.orig/fs/dcache.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/dcache.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/dcache.c linux-4.9.22/fs/dcache.c
+--- linux-4.9.22.orig/fs/dcache.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/dcache.c 2017-04-18 17:19:16.654772144 +0200
@@ -19,6 +19,7 @@
#include <linux/mm.h>
#include <linux/fs.h>
@@ -5367,9 +5594,9 @@ diff -Nur linux-4.9.6.orig/fs/dcache.c linux-4.9.6/fs/dcache.c
dcache_init_early();
inode_init_early();
}
-diff -Nur linux-4.9.6.orig/fs/eventpoll.c linux-4.9.6/fs/eventpoll.c
---- linux-4.9.6.orig/fs/eventpoll.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/eventpoll.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/eventpoll.c linux-4.9.22/fs/eventpoll.c
+--- linux-4.9.22.orig/fs/eventpoll.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/eventpoll.c 2017-04-18 17:19:16.654772144 +0200
@@ -510,12 +510,12 @@
*/
static void ep_poll_safewake(wait_queue_head_t *wq)
@@ -5385,9 +5612,9 @@ diff -Nur linux-4.9.6.orig/fs/eventpoll.c linux-4.9.6/fs/eventpoll.c
}
static void ep_remove_wait_queue(struct eppoll_entry *pwq)
-diff -Nur linux-4.9.6.orig/fs/exec.c linux-4.9.6/fs/exec.c
---- linux-4.9.6.orig/fs/exec.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/exec.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/exec.c linux-4.9.22/fs/exec.c
+--- linux-4.9.22.orig/fs/exec.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/exec.c 2017-04-18 17:19:16.658772300 +0200
@@ -1017,12 +1017,14 @@
}
}
@@ -5403,9 +5630,9 @@ diff -Nur linux-4.9.6.orig/fs/exec.c linux-4.9.6/fs/exec.c
task_unlock(tsk);
if (old_mm) {
up_read(&old_mm->mmap_sem);
-diff -Nur linux-4.9.6.orig/fs/fuse/dir.c linux-4.9.6/fs/fuse/dir.c
---- linux-4.9.6.orig/fs/fuse/dir.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/fuse/dir.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/fuse/dir.c linux-4.9.22/fs/fuse/dir.c
+--- linux-4.9.22.orig/fs/fuse/dir.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/fuse/dir.c 2017-04-18 17:19:16.658772300 +0200
@@ -1191,7 +1191,7 @@
struct inode *dir = d_inode(parent);
struct fuse_conn *fc;
@@ -5415,9 +5642,9 @@ diff -Nur linux-4.9.6.orig/fs/fuse/dir.c linux-4.9.6/fs/fuse/dir.c
if (!o->nodeid) {
/*
-diff -Nur linux-4.9.6.orig/fs/jbd2/checkpoint.c linux-4.9.6/fs/jbd2/checkpoint.c
---- linux-4.9.6.orig/fs/jbd2/checkpoint.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/jbd2/checkpoint.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/jbd2/checkpoint.c linux-4.9.22/fs/jbd2/checkpoint.c
+--- linux-4.9.22.orig/fs/jbd2/checkpoint.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/jbd2/checkpoint.c 2017-04-18 17:19:16.658772300 +0200
@@ -116,6 +116,8 @@
nblocks = jbd2_space_needed(journal);
while (jbd2_log_space_left(journal) < nblocks) {
@@ -5427,9 +5654,9 @@ diff -Nur linux-4.9.6.orig/fs/jbd2/checkpoint.c linux-4.9.6/fs/jbd2/checkpoint.c
mutex_lock(&journal->j_checkpoint_mutex);
/*
-diff -Nur linux-4.9.6.orig/fs/locks.c linux-4.9.6/fs/locks.c
---- linux-4.9.6.orig/fs/locks.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/locks.c 2017-01-28 13:59:09.927656033 +0100
+diff -Nur linux-4.9.22.orig/fs/locks.c linux-4.9.22/fs/locks.c
+--- linux-4.9.22.orig/fs/locks.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/locks.c 2017-04-18 17:19:16.658772300 +0200
@@ -935,7 +935,7 @@
return -ENOMEM;
}
@@ -5570,10 +5797,10 @@ diff -Nur linux-4.9.6.orig/fs/locks.c linux-4.9.6/fs/locks.c
locks_dispose_list(&dispose);
}
-diff -Nur linux-4.9.6.orig/fs/namei.c linux-4.9.6/fs/namei.c
---- linux-4.9.6.orig/fs/namei.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/namei.c 2017-01-28 13:59:09.927656033 +0100
-@@ -1629,7 +1629,7 @@
+diff -Nur linux-4.9.22.orig/fs/namei.c linux-4.9.22/fs/namei.c
+--- linux-4.9.22.orig/fs/namei.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/namei.c 2017-04-18 17:19:16.658772300 +0200
+@@ -1626,7 +1626,7 @@
{
struct dentry *dentry = ERR_PTR(-ENOENT), *old;
struct inode *inode = dir->d_inode;
@@ -5582,7 +5809,7 @@ diff -Nur linux-4.9.6.orig/fs/namei.c linux-4.9.6/fs/namei.c
inode_lock_shared(inode);
/* Don't go there if it's already dead */
-@@ -3086,7 +3086,7 @@
+@@ -3083,7 +3083,7 @@
struct dentry *dentry;
int error, create_error = 0;
umode_t mode = op->mode;
@@ -5591,9 +5818,9 @@ diff -Nur linux-4.9.6.orig/fs/namei.c linux-4.9.6/fs/namei.c
if (unlikely(IS_DEADDIR(dir_inode)))
return -ENOENT;
-diff -Nur linux-4.9.6.orig/fs/namespace.c linux-4.9.6/fs/namespace.c
---- linux-4.9.6.orig/fs/namespace.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/namespace.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/namespace.c linux-4.9.22/fs/namespace.c
+--- linux-4.9.22.orig/fs/namespace.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/namespace.c 2017-04-18 17:19:16.658772300 +0200
@@ -14,6 +14,7 @@
#include <linux/mnt_namespace.h>
#include <linux/user_namespace.h>
@@ -5616,9 +5843,9 @@ diff -Nur linux-4.9.6.orig/fs/namespace.c linux-4.9.6/fs/namespace.c
/*
* After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
* be set to match its requirements. So we must not load that until
-diff -Nur linux-4.9.6.orig/fs/nfs/delegation.c linux-4.9.6/fs/nfs/delegation.c
---- linux-4.9.6.orig/fs/nfs/delegation.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/delegation.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/delegation.c linux-4.9.22/fs/nfs/delegation.c
+--- linux-4.9.22.orig/fs/nfs/delegation.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/delegation.c 2017-04-18 17:19:16.658772300 +0200
@@ -150,11 +150,11 @@
sp = state->owner;
/* Block nfs4_proc_unlck */
@@ -5633,9 +5860,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/delegation.c linux-4.9.6/fs/nfs/delegation.c
err = -EAGAIN;
mutex_unlock(&sp->so_delegreturn_mutex);
put_nfs_open_context(ctx);
-diff -Nur linux-4.9.6.orig/fs/nfs/dir.c linux-4.9.6/fs/nfs/dir.c
---- linux-4.9.6.orig/fs/nfs/dir.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/dir.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/dir.c linux-4.9.22/fs/nfs/dir.c
+--- linux-4.9.22.orig/fs/nfs/dir.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/dir.c 2017-04-18 17:19:16.658772300 +0200
@@ -485,7 +485,7 @@
void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
{
@@ -5678,9 +5905,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/dir.c linux-4.9.6/fs/nfs/dir.c
} else
error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
trace_nfs_rmdir_exit(dir, dentry, error);
-diff -Nur linux-4.9.6.orig/fs/nfs/inode.c linux-4.9.6/fs/nfs/inode.c
---- linux-4.9.6.orig/fs/nfs/inode.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/inode.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/inode.c linux-4.9.22/fs/nfs/inode.c
+--- linux-4.9.22.orig/fs/nfs/inode.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/inode.c 2017-04-18 17:19:16.658772300 +0200
@@ -1957,7 +1957,11 @@
nfsi->nrequests = 0;
nfsi->commit_info.ncommit = 0;
@@ -5693,9 +5920,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/inode.c linux-4.9.6/fs/nfs/inode.c
nfs4_init_once(nfsi);
}
-diff -Nur linux-4.9.6.orig/fs/nfs/nfs4_fs.h linux-4.9.6/fs/nfs/nfs4_fs.h
---- linux-4.9.6.orig/fs/nfs/nfs4_fs.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/nfs4_fs.h 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/nfs4_fs.h linux-4.9.22/fs/nfs/nfs4_fs.h
+--- linux-4.9.22.orig/fs/nfs/nfs4_fs.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/nfs4_fs.h 2017-04-18 17:19:16.658772300 +0200
@@ -111,7 +111,7 @@
unsigned long so_flags;
struct list_head so_states;
@@ -5705,10 +5932,10 @@ diff -Nur linux-4.9.6.orig/fs/nfs/nfs4_fs.h linux-4.9.6/fs/nfs/nfs4_fs.h
struct mutex so_delegreturn_mutex;
};
-diff -Nur linux-4.9.6.orig/fs/nfs/nfs4proc.c linux-4.9.6/fs/nfs/nfs4proc.c
---- linux-4.9.6.orig/fs/nfs/nfs4proc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/nfs4proc.c 2017-01-28 13:59:09.931656187 +0100
-@@ -2697,7 +2697,7 @@
+diff -Nur linux-4.9.22.orig/fs/nfs/nfs4proc.c linux-4.9.22/fs/nfs/nfs4proc.c
+--- linux-4.9.22.orig/fs/nfs/nfs4proc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/nfs4proc.c 2017-04-18 17:19:16.662772455 +0200
+@@ -2695,7 +2695,7 @@
unsigned int seq;
int ret;
@@ -5717,8 +5944,8 @@ diff -Nur linux-4.9.6.orig/fs/nfs/nfs4proc.c linux-4.9.6/fs/nfs/nfs4proc.c
ret = _nfs4_proc_open(opendata);
if (ret != 0)
-@@ -2735,7 +2735,7 @@
- ctx->state = state;
+@@ -2733,7 +2733,7 @@
+
if (d_inode(dentry) == state->inode) {
nfs_inode_attach_open_context(ctx);
- if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
@@ -5726,9 +5953,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/nfs4proc.c linux-4.9.6/fs/nfs/nfs4proc.c
nfs4_schedule_stateid_recovery(server, state);
}
out:
-diff -Nur linux-4.9.6.orig/fs/nfs/nfs4state.c linux-4.9.6/fs/nfs/nfs4state.c
---- linux-4.9.6.orig/fs/nfs/nfs4state.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/nfs4state.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/nfs4state.c linux-4.9.22/fs/nfs/nfs4state.c
+--- linux-4.9.22.orig/fs/nfs/nfs4state.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/nfs4state.c 2017-04-18 17:19:16.662772455 +0200
@@ -488,7 +488,7 @@
nfs4_init_seqid_counter(&sp->so_seqid);
atomic_set(&sp->so_count, 1);
@@ -5777,9 +6004,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/nfs4state.c linux-4.9.6/fs/nfs/nfs4state.c
return status;
}
-diff -Nur linux-4.9.6.orig/fs/nfs/unlink.c linux-4.9.6/fs/nfs/unlink.c
---- linux-4.9.6.orig/fs/nfs/unlink.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/nfs/unlink.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/nfs/unlink.c linux-4.9.22/fs/nfs/unlink.c
+--- linux-4.9.22.orig/fs/nfs/unlink.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/nfs/unlink.c 2017-04-18 17:19:16.662772455 +0200
@@ -12,7 +12,7 @@
#include <linux/sunrpc/clnt.h>
#include <linux/nfs_fs.h>
@@ -5859,9 +6086,9 @@ diff -Nur linux-4.9.6.orig/fs/nfs/unlink.c linux-4.9.6/fs/nfs/unlink.c
status = -EBUSY;
spin_lock(&dentry->d_lock);
-diff -Nur linux-4.9.6.orig/fs/ntfs/aops.c linux-4.9.6/fs/ntfs/aops.c
---- linux-4.9.6.orig/fs/ntfs/aops.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/ntfs/aops.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/ntfs/aops.c linux-4.9.22/fs/ntfs/aops.c
+--- linux-4.9.22.orig/fs/ntfs/aops.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/ntfs/aops.c 2017-04-18 17:19:16.662772455 +0200
@@ -92,13 +92,13 @@
ofs = 0;
if (file_ofs < init_size)
@@ -5925,9 +6152,9 @@ diff -Nur linux-4.9.6.orig/fs/ntfs/aops.c linux-4.9.6/fs/ntfs/aops.c
}
/**
-diff -Nur linux-4.9.6.orig/fs/proc/base.c linux-4.9.6/fs/proc/base.c
---- linux-4.9.6.orig/fs/proc/base.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/proc/base.c 2017-01-28 13:59:09.931656187 +0100
+diff -Nur linux-4.9.22.orig/fs/proc/base.c linux-4.9.22/fs/proc/base.c
+--- linux-4.9.22.orig/fs/proc/base.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/proc/base.c 2017-04-18 17:19:16.662772455 +0200
@@ -1834,7 +1834,7 @@
child = d_hash_and_lookup(dir, &qname);
@@ -5937,9 +6164,9 @@ diff -Nur linux-4.9.6.orig/fs/proc/base.c linux-4.9.6/fs/proc/base.c
child = d_alloc_parallel(dir, &qname, &wq);
if (IS_ERR(child))
goto end_instantiate;
-diff -Nur linux-4.9.6.orig/fs/proc/proc_sysctl.c linux-4.9.6/fs/proc/proc_sysctl.c
---- linux-4.9.6.orig/fs/proc/proc_sysctl.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/proc/proc_sysctl.c 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/fs/proc/proc_sysctl.c linux-4.9.22/fs/proc/proc_sysctl.c
+--- linux-4.9.22.orig/fs/proc/proc_sysctl.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/proc/proc_sysctl.c 2017-04-18 17:19:16.662772455 +0200
@@ -632,7 +632,7 @@
child = d_lookup(dir, &qname);
@@ -5949,9 +6176,9 @@ diff -Nur linux-4.9.6.orig/fs/proc/proc_sysctl.c linux-4.9.6/fs/proc/proc_sysctl
child = d_alloc_parallel(dir, &qname, &wq);
if (IS_ERR(child))
return false;
-diff -Nur linux-4.9.6.orig/fs/timerfd.c linux-4.9.6/fs/timerfd.c
---- linux-4.9.6.orig/fs/timerfd.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/fs/timerfd.c 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/fs/timerfd.c linux-4.9.22/fs/timerfd.c
+--- linux-4.9.22.orig/fs/timerfd.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/fs/timerfd.c 2017-04-18 17:19:16.662772455 +0200
@@ -460,7 +460,10 @@
break;
}
@@ -5964,9 +6191,9 @@ diff -Nur linux-4.9.6.orig/fs/timerfd.c linux-4.9.6/fs/timerfd.c
}
/*
-diff -Nur linux-4.9.6.orig/include/acpi/platform/aclinux.h linux-4.9.6/include/acpi/platform/aclinux.h
---- linux-4.9.6.orig/include/acpi/platform/aclinux.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/acpi/platform/aclinux.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/acpi/platform/aclinux.h linux-4.9.22/include/acpi/platform/aclinux.h
+--- linux-4.9.22.orig/include/acpi/platform/aclinux.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/acpi/platform/aclinux.h 2017-04-18 17:19:16.662772455 +0200
@@ -133,6 +133,7 @@
#define acpi_cache_t struct kmem_cache
@@ -5996,9 +6223,9 @@ diff -Nur linux-4.9.6.orig/include/acpi/platform/aclinux.h linux-4.9.6/include/a
/*
* OSL interfaces used by debugger/disassembler
*/
-diff -Nur linux-4.9.6.orig/include/asm-generic/bug.h linux-4.9.6/include/asm-generic/bug.h
---- linux-4.9.6.orig/include/asm-generic/bug.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/asm-generic/bug.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/asm-generic/bug.h linux-4.9.22/include/asm-generic/bug.h
+--- linux-4.9.22.orig/include/asm-generic/bug.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/asm-generic/bug.h 2017-04-18 17:19:16.662772455 +0200
@@ -215,6 +215,20 @@
# define WARN_ON_SMP(x) ({0;})
#endif
@@ -6020,9 +6247,9 @@ diff -Nur linux-4.9.6.orig/include/asm-generic/bug.h linux-4.9.6/include/asm-gen
#endif /* __ASSEMBLY__ */
#endif
-diff -Nur linux-4.9.6.orig/include/linux/blkdev.h linux-4.9.6/include/linux/blkdev.h
---- linux-4.9.6.orig/include/linux/blkdev.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/blkdev.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/blkdev.h linux-4.9.22/include/linux/blkdev.h
+--- linux-4.9.22.orig/include/linux/blkdev.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/blkdev.h 2017-04-18 17:19:16.662772455 +0200
@@ -89,6 +89,7 @@
struct list_head queuelist;
union {
@@ -6040,9 +6267,9 @@ diff -Nur linux-4.9.6.orig/include/linux/blkdev.h linux-4.9.6/include/linux/blkd
struct percpu_ref q_usage_counter;
struct list_head all_q_node;
-diff -Nur linux-4.9.6.orig/include/linux/blk-mq.h linux-4.9.6/include/linux/blk-mq.h
---- linux-4.9.6.orig/include/linux/blk-mq.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/blk-mq.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/blk-mq.h linux-4.9.22/include/linux/blk-mq.h
+--- linux-4.9.22.orig/include/linux/blk-mq.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/blk-mq.h 2017-04-18 17:19:16.662772455 +0200
@@ -209,7 +209,7 @@
return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
}
@@ -6052,9 +6279,9 @@ diff -Nur linux-4.9.6.orig/include/linux/blk-mq.h linux-4.9.6/include/linux/blk-
int blk_mq_request_started(struct request *rq);
void blk_mq_start_request(struct request *rq);
void blk_mq_end_request(struct request *rq, int error);
-diff -Nur linux-4.9.6.orig/include/linux/bottom_half.h linux-4.9.6/include/linux/bottom_half.h
---- linux-4.9.6.orig/include/linux/bottom_half.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/bottom_half.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/bottom_half.h linux-4.9.22/include/linux/bottom_half.h
+--- linux-4.9.22.orig/include/linux/bottom_half.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/bottom_half.h 2017-04-18 17:19:16.662772455 +0200
@@ -3,6 +3,39 @@
#include <linux/preempt.h>
@@ -6102,9 +6329,9 @@ diff -Nur linux-4.9.6.orig/include/linux/bottom_half.h linux-4.9.6/include/linux
+#endif
#endif /* _LINUX_BH_H */
-diff -Nur linux-4.9.6.orig/include/linux/buffer_head.h linux-4.9.6/include/linux/buffer_head.h
---- linux-4.9.6.orig/include/linux/buffer_head.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/buffer_head.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/buffer_head.h linux-4.9.22/include/linux/buffer_head.h
+--- linux-4.9.22.orig/include/linux/buffer_head.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/buffer_head.h 2017-04-18 17:19:16.662772455 +0200
@@ -75,8 +75,50 @@
struct address_space *b_assoc_map; /* mapping this buffer is
associated with */
@@ -6156,9 +6383,9 @@ diff -Nur linux-4.9.6.orig/include/linux/buffer_head.h linux-4.9.6/include/linux
/*
* macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
* and buffer_foo() functions.
-diff -Nur linux-4.9.6.orig/include/linux/cgroup-defs.h linux-4.9.6/include/linux/cgroup-defs.h
---- linux-4.9.6.orig/include/linux/cgroup-defs.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/cgroup-defs.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/cgroup-defs.h linux-4.9.22/include/linux/cgroup-defs.h
+--- linux-4.9.22.orig/include/linux/cgroup-defs.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/cgroup-defs.h 2017-04-18 17:19:16.662772455 +0200
@@ -16,6 +16,7 @@
#include <linux/percpu-refcount.h>
#include <linux/percpu-rwsem.h>
@@ -6175,9 +6402,9 @@ diff -Nur linux-4.9.6.orig/include/linux/cgroup-defs.h linux-4.9.6/include/linux
};
/*
-diff -Nur linux-4.9.6.orig/include/linux/completion.h linux-4.9.6/include/linux/completion.h
---- linux-4.9.6.orig/include/linux/completion.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/completion.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/completion.h linux-4.9.22/include/linux/completion.h
+--- linux-4.9.22.orig/include/linux/completion.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/completion.h 2017-04-18 17:19:16.662772455 +0200
@@ -7,8 +7,7 @@
* Atomic wait-for-completion handler data structures.
* See kernel/sched/completion.c for details.
@@ -6211,9 +6438,9 @@ diff -Nur linux-4.9.6.orig/include/linux/completion.h linux-4.9.6/include/linux/
}
/**
-diff -Nur linux-4.9.6.orig/include/linux/cpu.h linux-4.9.6/include/linux/cpu.h
---- linux-4.9.6.orig/include/linux/cpu.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/cpu.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/cpu.h linux-4.9.22/include/linux/cpu.h
+--- linux-4.9.22.orig/include/linux/cpu.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/cpu.h 2017-04-18 17:19:16.662772455 +0200
@@ -182,6 +182,8 @@
extern void put_online_cpus(void);
extern void cpu_hotplug_disable(void);
@@ -6232,9 +6459,9 @@ diff -Nur linux-4.9.6.orig/include/linux/cpu.h linux-4.9.6/include/linux/cpu.h
#define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0)
#define __hotcpu_notifier(fn, pri) do { (void)(fn); } while (0)
/* These aren't inline functions due to a GCC bug. */
-diff -Nur linux-4.9.6.orig/include/linux/dcache.h linux-4.9.6/include/linux/dcache.h
---- linux-4.9.6.orig/include/linux/dcache.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/dcache.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/dcache.h linux-4.9.22/include/linux/dcache.h
+--- linux-4.9.22.orig/include/linux/dcache.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/dcache.h 2017-04-18 17:19:16.662772455 +0200
@@ -11,6 +11,7 @@
#include <linux/rcupdate.h>
#include <linux/lockref.h>
@@ -6261,9 +6488,9 @@ diff -Nur linux-4.9.6.orig/include/linux/dcache.h linux-4.9.6/include/linux/dcac
extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *);
extern struct dentry * d_exact_alias(struct dentry *, struct inode *);
-diff -Nur linux-4.9.6.orig/include/linux/delay.h linux-4.9.6/include/linux/delay.h
---- linux-4.9.6.orig/include/linux/delay.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/delay.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/delay.h linux-4.9.22/include/linux/delay.h
+--- linux-4.9.22.orig/include/linux/delay.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/delay.h 2017-04-18 17:19:16.662772455 +0200
@@ -52,4 +52,10 @@
msleep(seconds * 1000);
}
@@ -6275,9 +6502,9 @@ diff -Nur linux-4.9.6.orig/include/linux/delay.h linux-4.9.6/include/linux/delay
+#endif
+
#endif /* defined(_LINUX_DELAY_H) */
-diff -Nur linux-4.9.6.orig/include/linux/highmem.h linux-4.9.6/include/linux/highmem.h
---- linux-4.9.6.orig/include/linux/highmem.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/highmem.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/highmem.h linux-4.9.22/include/linux/highmem.h
+--- linux-4.9.22.orig/include/linux/highmem.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/highmem.h 2017-04-18 17:19:16.666772610 +0200
@@ -7,6 +7,7 @@
#include <linux/mm.h>
#include <linux/uaccess.h>
@@ -6360,9 +6587,9 @@ diff -Nur linux-4.9.6.orig/include/linux/highmem.h linux-4.9.6/include/linux/hig
#endif
}
-diff -Nur linux-4.9.6.orig/include/linux/hrtimer.h linux-4.9.6/include/linux/hrtimer.h
---- linux-4.9.6.orig/include/linux/hrtimer.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/hrtimer.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/hrtimer.h linux-4.9.22/include/linux/hrtimer.h
+--- linux-4.9.22.orig/include/linux/hrtimer.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/hrtimer.h 2017-04-18 17:19:16.666772610 +0200
@@ -87,6 +87,9 @@
* @function: timer expiry callback function
* @base: pointer to the timer base (per cpu and per clock)
@@ -6445,18 +6672,27 @@ diff -Nur linux-4.9.6.orig/include/linux/hrtimer.h linux-4.9.6/include/linux/hrt
/* Query timers: */
extern ktime_t __hrtimer_get_remaining(const struct hrtimer *timer, bool adjust);
-@@ -436,7 +453,7 @@
+@@ -436,9 +453,15 @@
* Helper function to check, whether the timer is running the callback
* function
*/
-static inline int hrtimer_callback_running(struct hrtimer *timer)
+static inline int hrtimer_callback_running(const struct hrtimer *timer)
{
- return timer->base->cpu_base->running == timer;
+- return timer->base->cpu_base->running == timer;
++ if (timer->base->cpu_base->running == timer)
++ return 1;
++#ifdef CONFIG_PREEMPT_RT_BASE
++ if (timer->base->cpu_base->running_soft == timer)
++ return 1;
++#endif
++ return 0;
}
-diff -Nur linux-4.9.6.orig/include/linux/idr.h linux-4.9.6/include/linux/idr.h
---- linux-4.9.6.orig/include/linux/idr.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/idr.h 2017-01-28 13:59:09.935656342 +0100
+
+ /* Forward a hrtimer so it expires after now: */
+diff -Nur linux-4.9.22.orig/include/linux/idr.h linux-4.9.22/include/linux/idr.h
+--- linux-4.9.22.orig/include/linux/idr.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/idr.h 2017-04-18 17:19:16.666772610 +0200
@@ -95,10 +95,14 @@
* Each idr_preload() should be matched with an invocation of this
* function. See idr_preload() for details.
@@ -6472,9 +6708,9 @@ diff -Nur linux-4.9.6.orig/include/linux/idr.h linux-4.9.6/include/linux/idr.h
/**
* idr_find - return pointer for given id
-diff -Nur linux-4.9.6.orig/include/linux/init_task.h linux-4.9.6/include/linux/init_task.h
---- linux-4.9.6.orig/include/linux/init_task.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/init_task.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/init_task.h linux-4.9.22/include/linux/init_task.h
+--- linux-4.9.22.orig/include/linux/init_task.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/init_task.h 2017-04-18 17:19:16.666772610 +0200
@@ -150,6 +150,12 @@
# define INIT_PERF_EVENTS(tsk)
#endif
@@ -6496,9 +6732,9 @@ diff -Nur linux-4.9.6.orig/include/linux/init_task.h linux-4.9.6/include/linux/i
.pids = { \
[PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \
[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \
-diff -Nur linux-4.9.6.orig/include/linux/interrupt.h linux-4.9.6/include/linux/interrupt.h
---- linux-4.9.6.orig/include/linux/interrupt.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/interrupt.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/interrupt.h linux-4.9.22/include/linux/interrupt.h
+--- linux-4.9.22.orig/include/linux/interrupt.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/interrupt.h 2017-04-18 17:19:16.666772610 +0200
@@ -14,6 +14,7 @@
#include <linux/hrtimer.h>
#include <linux/kref.h>
@@ -6687,9 +6923,9 @@ diff -Nur linux-4.9.6.orig/include/linux/interrupt.h linux-4.9.6/include/linux/i
/*
* Autoprobing for irqs:
*
-diff -Nur linux-4.9.6.orig/include/linux/irqdesc.h linux-4.9.6/include/linux/irqdesc.h
---- linux-4.9.6.orig/include/linux/irqdesc.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/irqdesc.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/irqdesc.h linux-4.9.22/include/linux/irqdesc.h
+--- linux-4.9.22.orig/include/linux/irqdesc.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/irqdesc.h 2017-04-18 17:19:16.666772610 +0200
@@ -66,6 +66,7 @@
unsigned int irqs_unhandled;
atomic_t threads_handled;
@@ -6698,9 +6934,9 @@ diff -Nur linux-4.9.6.orig/include/linux/irqdesc.h linux-4.9.6/include/linux/irq
raw_spinlock_t lock;
struct cpumask *percpu_enabled;
const struct cpumask *percpu_affinity;
-diff -Nur linux-4.9.6.orig/include/linux/irqflags.h linux-4.9.6/include/linux/irqflags.h
---- linux-4.9.6.orig/include/linux/irqflags.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/irqflags.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/irqflags.h linux-4.9.22/include/linux/irqflags.h
+--- linux-4.9.22.orig/include/linux/irqflags.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/irqflags.h 2017-04-18 17:19:16.666772610 +0200
@@ -25,8 +25,6 @@
# define trace_softirqs_enabled(p) ((p)->softirqs_enabled)
# define trace_hardirq_enter() do { current->hardirq_context++; } while (0)
@@ -6751,9 +6987,9 @@ diff -Nur linux-4.9.6.orig/include/linux/irqflags.h linux-4.9.6/include/linux/ir
+#endif
+
#endif
-diff -Nur linux-4.9.6.orig/include/linux/irq.h linux-4.9.6/include/linux/irq.h
---- linux-4.9.6.orig/include/linux/irq.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/irq.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/irq.h linux-4.9.22/include/linux/irq.h
+--- linux-4.9.22.orig/include/linux/irq.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/irq.h 2017-04-18 17:19:16.666772610 +0200
@@ -72,6 +72,7 @@
* IRQ_IS_POLLED - Always polled by another interrupt. Exclude
* it from the spurious interrupt detection
@@ -6778,9 +7014,9 @@ diff -Nur linux-4.9.6.orig/include/linux/irq.h linux-4.9.6/include/linux/irq.h
#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
-diff -Nur linux-4.9.6.orig/include/linux/irq_work.h linux-4.9.6/include/linux/irq_work.h
---- linux-4.9.6.orig/include/linux/irq_work.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/irq_work.h 2017-01-28 13:59:09.935656342 +0100
+diff -Nur linux-4.9.22.orig/include/linux/irq_work.h linux-4.9.22/include/linux/irq_work.h
+--- linux-4.9.22.orig/include/linux/irq_work.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/irq_work.h 2017-04-18 17:19:16.666772610 +0200
@@ -16,6 +16,7 @@
#define IRQ_WORK_BUSY 2UL
#define IRQ_WORK_FLAGS 3UL
@@ -6800,9 +7036,9 @@ diff -Nur linux-4.9.6.orig/include/linux/irq_work.h linux-4.9.6/include/linux/ir
+#endif
+
#endif /* _LINUX_IRQ_WORK_H */
-diff -Nur linux-4.9.6.orig/include/linux/jbd2.h linux-4.9.6/include/linux/jbd2.h
---- linux-4.9.6.orig/include/linux/jbd2.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/jbd2.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/jbd2.h linux-4.9.22/include/linux/jbd2.h
+--- linux-4.9.22.orig/include/linux/jbd2.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/jbd2.h 2017-04-18 17:19:16.666772610 +0200
@@ -347,32 +347,56 @@
static inline void jbd_lock_bh_state(struct buffer_head *bh)
@@ -6860,9 +7096,9 @@ diff -Nur linux-4.9.6.orig/include/linux/jbd2.h linux-4.9.6/include/linux/jbd2.h
}
#define J_ASSERT(assert) BUG_ON(!(assert))
-diff -Nur linux-4.9.6.orig/include/linux/kdb.h linux-4.9.6/include/linux/kdb.h
---- linux-4.9.6.orig/include/linux/kdb.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/kdb.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/kdb.h linux-4.9.22/include/linux/kdb.h
+--- linux-4.9.22.orig/include/linux/kdb.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/kdb.h 2017-04-18 17:19:16.666772610 +0200
@@ -167,6 +167,7 @@
extern __printf(1, 2) int kdb_printf(const char *, ...);
typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...);
@@ -6879,9 +7115,9 @@ diff -Nur linux-4.9.6.orig/include/linux/kdb.h linux-4.9.6/include/linux/kdb.h
static inline void kdb_init(int level) {}
static inline int kdb_register(char *cmd, kdb_func_t func, char *usage,
char *help, short minlen) { return 0; }
-diff -Nur linux-4.9.6.orig/include/linux/kernel.h linux-4.9.6/include/linux/kernel.h
---- linux-4.9.6.orig/include/linux/kernel.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/kernel.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/kernel.h linux-4.9.22/include/linux/kernel.h
+--- linux-4.9.22.orig/include/linux/kernel.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/kernel.h 2017-04-18 17:19:16.666772610 +0200
@@ -194,6 +194,9 @@
*/
# define might_sleep() \
@@ -6908,9 +7144,9 @@ diff -Nur linux-4.9.6.orig/include/linux/kernel.h linux-4.9.6/include/linux/kern
} system_state;
#define TAINT_PROPRIETARY_MODULE 0
-diff -Nur linux-4.9.6.orig/include/linux/list_bl.h linux-4.9.6/include/linux/list_bl.h
---- linux-4.9.6.orig/include/linux/list_bl.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/list_bl.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/list_bl.h linux-4.9.22/include/linux/list_bl.h
+--- linux-4.9.22.orig/include/linux/list_bl.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/list_bl.h 2017-04-18 17:19:16.666772610 +0200
@@ -2,6 +2,7 @@
#define _LINUX_LIST_BL_H
@@ -6973,9 +7209,9 @@ diff -Nur linux-4.9.6.orig/include/linux/list_bl.h linux-4.9.6/include/linux/lis
}
static inline bool hlist_bl_is_locked(struct hlist_bl_head *b)
-diff -Nur linux-4.9.6.orig/include/linux/locallock.h linux-4.9.6/include/linux/locallock.h
---- linux-4.9.6.orig/include/linux/locallock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/locallock.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/locallock.h linux-4.9.22/include/linux/locallock.h
+--- linux-4.9.22.orig/include/linux/locallock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/locallock.h 2017-04-18 17:19:16.666772610 +0200
@@ -0,0 +1,278 @@
+#ifndef _LINUX_LOCALLOCK_H
+#define _LINUX_LOCALLOCK_H
@@ -7255,9 +7491,9 @@ diff -Nur linux-4.9.6.orig/include/linux/locallock.h linux-4.9.6/include/linux/l
+#endif
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/mm_types.h linux-4.9.6/include/linux/mm_types.h
---- linux-4.9.6.orig/include/linux/mm_types.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/mm_types.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/mm_types.h linux-4.9.22/include/linux/mm_types.h
+--- linux-4.9.22.orig/include/linux/mm_types.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/mm_types.h 2017-04-18 17:19:16.666772610 +0200
@@ -11,6 +11,7 @@
#include <linux/completion.h>
#include <linux/cpumask.h>
@@ -7276,9 +7512,32 @@ diff -Nur linux-4.9.6.orig/include/linux/mm_types.h linux-4.9.6/include/linux/mm
#ifdef CONFIG_X86_INTEL_MPX
/* address of the bounds directory */
void __user *bd_addr;
-diff -Nur linux-4.9.6.orig/include/linux/mutex.h linux-4.9.6/include/linux/mutex.h
---- linux-4.9.6.orig/include/linux/mutex.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/mutex.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/module.h linux-4.9.22/include/linux/module.h
+--- linux-4.9.22.orig/include/linux/module.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/module.h 2017-04-18 17:19:16.666772610 +0200
+@@ -496,6 +496,7 @@
+ struct module *__module_text_address(unsigned long addr);
+ struct module *__module_address(unsigned long addr);
+ bool is_module_address(unsigned long addr);
++bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr);
+ bool is_module_percpu_address(unsigned long addr);
+ bool is_module_text_address(unsigned long addr);
+
+@@ -662,6 +663,11 @@
+ {
+ return false;
+ }
++
++static inline bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
++{
++ return false;
++}
+
+ static inline bool is_module_text_address(unsigned long addr)
+ {
+diff -Nur linux-4.9.22.orig/include/linux/mutex.h linux-4.9.22/include/linux/mutex.h
+--- linux-4.9.22.orig/include/linux/mutex.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/mutex.h 2017-04-18 17:19:16.666772610 +0200
@@ -19,6 +19,17 @@
#include <asm/processor.h>
#include <linux/osq_lock.h>
@@ -7320,10 +7579,10 @@ diff -Nur linux-4.9.6.orig/include/linux/mutex.h linux-4.9.6/include/linux/mutex
extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
#endif /* __LINUX_MUTEX_H */
-diff -Nur linux-4.9.6.orig/include/linux/mutex_rt.h linux-4.9.6/include/linux/mutex_rt.h
---- linux-4.9.6.orig/include/linux/mutex_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/mutex_rt.h 2017-01-28 13:59:09.939656496 +0100
-@@ -0,0 +1,84 @@
+diff -Nur linux-4.9.22.orig/include/linux/mutex_rt.h linux-4.9.22/include/linux/mutex_rt.h
+--- linux-4.9.22.orig/include/linux/mutex_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/mutex_rt.h 2017-04-18 17:19:16.666772610 +0200
+@@ -0,0 +1,89 @@
+#ifndef __LINUX_MUTEX_RT_H
+#define __LINUX_MUTEX_RT_H
+
@@ -7369,7 +7628,12 @@ diff -Nur linux-4.9.6.orig/include/linux/mutex_rt.h linux-4.9.6/include/linux/mu
+#define mutex_lock_killable(l) _mutex_lock_killable(l)
+#define mutex_trylock(l) _mutex_trylock(l)
+#define mutex_unlock(l) _mutex_unlock(l)
++
++#ifdef CONFIG_DEBUG_MUTEXES
+#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock)
++#else
++static inline void mutex_destroy(struct mutex *lock) {}
++#endif
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s)
@@ -7408,9 +7672,9 @@ diff -Nur linux-4.9.6.orig/include/linux/mutex_rt.h linux-4.9.6/include/linux/mu
+} while (0)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/netdevice.h linux-4.9.6/include/linux/netdevice.h
---- linux-4.9.6.orig/include/linux/netdevice.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/netdevice.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/netdevice.h linux-4.9.22/include/linux/netdevice.h
+--- linux-4.9.22.orig/include/linux/netdevice.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/netdevice.h 2017-04-18 17:19:16.666772610 +0200
@@ -396,7 +396,19 @@
typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
@@ -7431,7 +7695,7 @@ diff -Nur linux-4.9.6.orig/include/linux/netdevice.h linux-4.9.6/include/linux/n
static inline bool napi_disable_pending(struct napi_struct *n)
{
-@@ -2461,14 +2473,53 @@
+@@ -2463,14 +2475,53 @@
void synchronize_net(void);
int init_dummy_netdev(struct net_device *dev);
@@ -7486,7 +7750,7 @@ diff -Nur linux-4.9.6.orig/include/linux/netdevice.h linux-4.9.6/include/linux/n
struct net_device *dev_get_by_index(struct net *net, int ifindex);
struct net_device *__dev_get_by_index(struct net *net, int ifindex);
struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
-@@ -2851,6 +2902,7 @@
+@@ -2855,6 +2906,7 @@
unsigned int dropped;
struct sk_buff_head input_pkt_queue;
struct napi_struct backlog;
@@ -7494,9 +7758,9 @@ diff -Nur linux-4.9.6.orig/include/linux/netdevice.h linux-4.9.6/include/linux/n
};
-diff -Nur linux-4.9.6.orig/include/linux/netfilter/x_tables.h linux-4.9.6/include/linux/netfilter/x_tables.h
---- linux-4.9.6.orig/include/linux/netfilter/x_tables.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/netfilter/x_tables.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/netfilter/x_tables.h linux-4.9.22/include/linux/netfilter/x_tables.h
+--- linux-4.9.22.orig/include/linux/netfilter/x_tables.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/netfilter/x_tables.h 2017-04-18 17:19:16.666772610 +0200
@@ -4,6 +4,7 @@
#include <linux/netdevice.h>
@@ -7532,9 +7796,9 @@ diff -Nur linux-4.9.6.orig/include/linux/netfilter/x_tables.h linux-4.9.6/includ
}
/*
-diff -Nur linux-4.9.6.orig/include/linux/nfs_fs.h linux-4.9.6/include/linux/nfs_fs.h
---- linux-4.9.6.orig/include/linux/nfs_fs.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/nfs_fs.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/nfs_fs.h linux-4.9.22/include/linux/nfs_fs.h
+--- linux-4.9.22.orig/include/linux/nfs_fs.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/nfs_fs.h 2017-04-18 17:19:16.666772610 +0200
@@ -165,7 +165,11 @@
/* Readers: in-flight sillydelete RPC calls */
@@ -7547,9 +7811,9 @@ diff -Nur linux-4.9.6.orig/include/linux/nfs_fs.h linux-4.9.6/include/linux/nfs_
#if IS_ENABLED(CONFIG_NFS_V4)
struct nfs4_cached_acl *nfs4_acl;
-diff -Nur linux-4.9.6.orig/include/linux/nfs_xdr.h linux-4.9.6/include/linux/nfs_xdr.h
---- linux-4.9.6.orig/include/linux/nfs_xdr.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/nfs_xdr.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/nfs_xdr.h linux-4.9.22/include/linux/nfs_xdr.h
+--- linux-4.9.22.orig/include/linux/nfs_xdr.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/nfs_xdr.h 2017-04-18 17:19:16.670772765 +0200
@@ -1490,7 +1490,7 @@
struct nfs_removeargs args;
struct nfs_removeres res;
@@ -7559,9 +7823,9 @@ diff -Nur linux-4.9.6.orig/include/linux/nfs_xdr.h linux-4.9.6/include/linux/nfs
struct rpc_cred *cred;
struct nfs_fattr dir_attr;
long timeout;
-diff -Nur linux-4.9.6.orig/include/linux/notifier.h linux-4.9.6/include/linux/notifier.h
---- linux-4.9.6.orig/include/linux/notifier.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/notifier.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/notifier.h linux-4.9.22/include/linux/notifier.h
+--- linux-4.9.22.orig/include/linux/notifier.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/notifier.h 2017-04-18 17:19:16.670772765 +0200
@@ -6,7 +6,7 @@
*
* Alan Cox <Alan.Cox@linux.org>
@@ -7641,9 +7905,9 @@ diff -Nur linux-4.9.6.orig/include/linux/notifier.h linux-4.9.6/include/linux/no
/* CPU notfiers are defined in include/linux/cpu.h. */
/* netdevice notifiers are defined in include/linux/netdevice.h */
-diff -Nur linux-4.9.6.orig/include/linux/percpu.h linux-4.9.6/include/linux/percpu.h
---- linux-4.9.6.orig/include/linux/percpu.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/percpu.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/percpu.h linux-4.9.22/include/linux/percpu.h
+--- linux-4.9.22.orig/include/linux/percpu.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/percpu.h 2017-04-18 17:19:16.670772765 +0200
@@ -18,6 +18,35 @@
#define PERCPU_MODULE_RESERVE 0
#endif
@@ -7680,9 +7944,17 @@ diff -Nur linux-4.9.6.orig/include/linux/percpu.h linux-4.9.6/include/linux/perc
/* minimum unit size, also is the maximum supported allocation size */
#define PCPU_MIN_UNIT_SIZE PFN_ALIGN(32 << 10)
-diff -Nur linux-4.9.6.orig/include/linux/percpu-rwsem.h linux-4.9.6/include/linux/percpu-rwsem.h
---- linux-4.9.6.orig/include/linux/percpu-rwsem.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/percpu-rwsem.h 2017-01-28 13:59:09.939656496 +0100
+@@ -110,6 +139,7 @@
+ #endif
+
+ extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align);
++extern bool __is_kernel_percpu_address(unsigned long addr, unsigned long *can_addr);
+ extern bool is_kernel_percpu_address(unsigned long addr);
+
+ #if !defined(CONFIG_SMP) || !defined(CONFIG_HAVE_SETUP_PER_CPU_AREA)
+diff -Nur linux-4.9.22.orig/include/linux/percpu-rwsem.h linux-4.9.22/include/linux/percpu-rwsem.h
+--- linux-4.9.22.orig/include/linux/percpu-rwsem.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/percpu-rwsem.h 2017-04-18 17:19:16.670772765 +0200
@@ -4,7 +4,7 @@
#include <linux/atomic.h>
#include <linux/rwsem.h>
@@ -7764,9 +8036,9 @@ diff -Nur linux-4.9.6.orig/include/linux/percpu-rwsem.h linux-4.9.6/include/linu
extern void percpu_down_write(struct percpu_rw_semaphore *);
extern void percpu_up_write(struct percpu_rw_semaphore *);
-diff -Nur linux-4.9.6.orig/include/linux/pid.h linux-4.9.6/include/linux/pid.h
---- linux-4.9.6.orig/include/linux/pid.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/pid.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/pid.h linux-4.9.22/include/linux/pid.h
+--- linux-4.9.22.orig/include/linux/pid.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/pid.h 2017-04-18 17:19:16.670772765 +0200
@@ -2,6 +2,7 @@
#define _LINUX_PID_H
@@ -7775,9 +8047,9 @@ diff -Nur linux-4.9.6.orig/include/linux/pid.h linux-4.9.6/include/linux/pid.h
enum pid_type
{
-diff -Nur linux-4.9.6.orig/include/linux/preempt.h linux-4.9.6/include/linux/preempt.h
---- linux-4.9.6.orig/include/linux/preempt.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/preempt.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/preempt.h linux-4.9.22/include/linux/preempt.h
+--- linux-4.9.22.orig/include/linux/preempt.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/preempt.h 2017-04-18 17:19:16.670772765 +0200
@@ -50,7 +50,11 @@
#define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)
#define NMI_OFFSET (1UL << NMI_SHIFT)
@@ -7931,9 +8203,9 @@ diff -Nur linux-4.9.6.orig/include/linux/preempt.h linux-4.9.6/include/linux/pre
#ifdef CONFIG_PREEMPT_NOTIFIERS
struct preempt_notifier;
-diff -Nur linux-4.9.6.orig/include/linux/printk.h linux-4.9.6/include/linux/printk.h
---- linux-4.9.6.orig/include/linux/printk.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/printk.h 2017-01-28 13:59:09.939656496 +0100
+diff -Nur linux-4.9.22.orig/include/linux/printk.h linux-4.9.22/include/linux/printk.h
+--- linux-4.9.22.orig/include/linux/printk.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/printk.h 2017-04-18 17:19:16.670772765 +0200
@@ -126,9 +126,11 @@
#ifdef CONFIG_EARLY_PRINTK
extern asmlinkage __printf(1, 2)
@@ -7946,41 +8218,33 @@ diff -Nur linux-4.9.6.orig/include/linux/printk.h linux-4.9.6/include/linux/prin
#endif
#ifdef CONFIG_PRINTK_NMI
-diff -Nur linux-4.9.6.orig/include/linux/radix-tree.h linux-4.9.6/include/linux/radix-tree.h
---- linux-4.9.6.orig/include/linux/radix-tree.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/radix-tree.h 2017-01-28 13:59:09.939656496 +0100
-@@ -289,9 +289,19 @@
- unsigned int radix_tree_gang_lookup_slot(struct radix_tree_root *root,
- void ***results, unsigned long *indices,
- unsigned long first_index, unsigned int max_items);
-+#ifdef CONFIG_PREEMPT_RT_FULL
-+static inline int radix_tree_preload(gfp_t gm) { return 0; }
-+static inline int radix_tree_maybe_preload(gfp_t gfp_mask) { return 0; }
-+static inline int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order)
-+{
-+ return 0;
-+};
-+
-+#else
+diff -Nur linux-4.9.22.orig/include/linux/radix-tree.h linux-4.9.22/include/linux/radix-tree.h
+--- linux-4.9.22.orig/include/linux/radix-tree.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/radix-tree.h 2017-04-18 17:19:16.670772765 +0200
+@@ -292,6 +292,8 @@
int radix_tree_preload(gfp_t gfp_mask);
int radix_tree_maybe_preload(gfp_t gfp_mask);
int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order);
-+#endif
++void radix_tree_preload_end(void);
++
void radix_tree_init(void);
void *radix_tree_tag_set(struct radix_tree_root *root,
unsigned long index, unsigned int tag);
-@@ -316,7 +326,7 @@
+@@ -314,11 +316,6 @@
+ int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag);
+ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item);
- static inline void radix_tree_preload_end(void)
- {
+-static inline void radix_tree_preload_end(void)
+-{
- preempt_enable();
-+ preempt_enable_nort();
- }
-
+-}
+-
/**
-diff -Nur linux-4.9.6.orig/include/linux/random.h linux-4.9.6/include/linux/random.h
---- linux-4.9.6.orig/include/linux/random.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/random.h 2017-01-28 13:59:09.943656649 +0100
+ * struct radix_tree_iter - radix tree iterator state
+ *
+diff -Nur linux-4.9.22.orig/include/linux/random.h linux-4.9.22/include/linux/random.h
+--- linux-4.9.22.orig/include/linux/random.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/random.h 2017-04-18 17:19:16.670772765 +0200
@@ -31,7 +31,7 @@
extern void add_input_randomness(unsigned int type, unsigned int code,
@@ -7990,9 +8254,9 @@ diff -Nur linux-4.9.6.orig/include/linux/random.h linux-4.9.6/include/linux/rand
extern void get_random_bytes(void *buf, int nbytes);
extern int add_random_ready_callback(struct random_ready_callback *rdy);
-diff -Nur linux-4.9.6.orig/include/linux/rbtree_augmented.h linux-4.9.6/include/linux/rbtree_augmented.h
---- linux-4.9.6.orig/include/linux/rbtree_augmented.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rbtree_augmented.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rbtree_augmented.h linux-4.9.22/include/linux/rbtree_augmented.h
+--- linux-4.9.22.orig/include/linux/rbtree_augmented.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rbtree_augmented.h 2017-04-18 17:19:16.670772765 +0200
@@ -26,6 +26,7 @@
#include <linux/compiler.h>
@@ -8001,9 +8265,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rbtree_augmented.h linux-4.9.6/include/
/*
* Please note - only struct rb_augment_callbacks and the prototypes for
-diff -Nur linux-4.9.6.orig/include/linux/rbtree.h linux-4.9.6/include/linux/rbtree.h
---- linux-4.9.6.orig/include/linux/rbtree.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rbtree.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rbtree.h linux-4.9.22/include/linux/rbtree.h
+--- linux-4.9.22.orig/include/linux/rbtree.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rbtree.h 2017-04-18 17:19:16.670772765 +0200
@@ -31,7 +31,7 @@
#include <linux/kernel.h>
@@ -8013,9 +8277,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rbtree.h linux-4.9.6/include/linux/rbtr
struct rb_node {
unsigned long __rb_parent_color;
-diff -Nur linux-4.9.6.orig/include/linux/rcu_assign_pointer.h linux-4.9.6/include/linux/rcu_assign_pointer.h
---- linux-4.9.6.orig/include/linux/rcu_assign_pointer.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/rcu_assign_pointer.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rcu_assign_pointer.h linux-4.9.22/include/linux/rcu_assign_pointer.h
+--- linux-4.9.22.orig/include/linux/rcu_assign_pointer.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/rcu_assign_pointer.h 2017-04-18 17:19:16.670772765 +0200
@@ -0,0 +1,54 @@
+#ifndef __LINUX_RCU_ASSIGN_POINTER_H__
+#define __LINUX_RCU_ASSIGN_POINTER_H__
@@ -8071,9 +8335,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rcu_assign_pointer.h linux-4.9.6/includ
+})
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/rcupdate.h linux-4.9.6/include/linux/rcupdate.h
---- linux-4.9.6.orig/include/linux/rcupdate.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rcupdate.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rcupdate.h linux-4.9.22/include/linux/rcupdate.h
+--- linux-4.9.22.orig/include/linux/rcupdate.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rcupdate.h 2017-04-18 17:19:16.670772765 +0200
@@ -46,6 +46,7 @@
#include <linux/compiler.h>
#include <linux/ktime.h>
@@ -8221,9 +8485,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rcupdate.h linux-4.9.6/include/linux/rc
local_bh_enable();
}
-diff -Nur linux-4.9.6.orig/include/linux/rcutree.h linux-4.9.6/include/linux/rcutree.h
---- linux-4.9.6.orig/include/linux/rcutree.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rcutree.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rcutree.h linux-4.9.22/include/linux/rcutree.h
+--- linux-4.9.22.orig/include/linux/rcutree.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rcutree.h 2017-04-18 17:19:16.670772765 +0200
@@ -44,7 +44,11 @@
rcu_note_context_switch();
}
@@ -8283,9 +8547,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rcutree.h linux-4.9.6/include/linux/rcu
void rcu_all_qs(void);
/* RCUtree hotplug events */
-diff -Nur linux-4.9.6.orig/include/linux/rtmutex.h linux-4.9.6/include/linux/rtmutex.h
---- linux-4.9.6.orig/include/linux/rtmutex.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rtmutex.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rtmutex.h linux-4.9.22/include/linux/rtmutex.h
+--- linux-4.9.22.orig/include/linux/rtmutex.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rtmutex.h 2017-04-18 17:19:16.670772765 +0200
@@ -13,11 +13,15 @@
#define __LINUX_RT_MUTEX_H
@@ -8352,17 +8616,19 @@ diff -Nur linux-4.9.6.orig/include/linux/rtmutex.h linux-4.9.6/include/linux/rtm
#define DEFINE_RT_MUTEX(mutexname) \
struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname)
-@@ -91,6 +106,7 @@
+@@ -90,7 +105,9 @@
+ extern void rt_mutex_destroy(struct rt_mutex *lock);
extern void rt_mutex_lock(struct rt_mutex *lock);
++extern int rt_mutex_lock_state(struct rt_mutex *lock, int state);
extern int rt_mutex_lock_interruptible(struct rt_mutex *lock);
+extern int rt_mutex_lock_killable(struct rt_mutex *lock);
extern int rt_mutex_timed_lock(struct rt_mutex *lock,
struct hrtimer_sleeper *timeout);
-diff -Nur linux-4.9.6.orig/include/linux/rwlock_rt.h linux-4.9.6/include/linux/rwlock_rt.h
---- linux-4.9.6.orig/include/linux/rwlock_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/rwlock_rt.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rwlock_rt.h linux-4.9.22/include/linux/rwlock_rt.h
+--- linux-4.9.22.orig/include/linux/rwlock_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/rwlock_rt.h 2017-04-18 17:19:16.670772765 +0200
@@ -0,0 +1,99 @@
+#ifndef __LINUX_RWLOCK_RT_H
+#define __LINUX_RWLOCK_RT_H
@@ -8463,9 +8729,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rwlock_rt.h linux-4.9.6/include/linux/r
+ } while (0)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/rwlock_types.h linux-4.9.6/include/linux/rwlock_types.h
---- linux-4.9.6.orig/include/linux/rwlock_types.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rwlock_types.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rwlock_types.h linux-4.9.22/include/linux/rwlock_types.h
+--- linux-4.9.22.orig/include/linux/rwlock_types.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rwlock_types.h 2017-04-18 17:19:16.670772765 +0200
@@ -1,6 +1,10 @@
#ifndef __LINUX_RWLOCK_TYPES_H
#define __LINUX_RWLOCK_TYPES_H
@@ -8477,9 +8743,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rwlock_types.h linux-4.9.6/include/linu
/*
* include/linux/rwlock_types.h - generic rwlock type definitions
* and initializers
-diff -Nur linux-4.9.6.orig/include/linux/rwlock_types_rt.h linux-4.9.6/include/linux/rwlock_types_rt.h
---- linux-4.9.6.orig/include/linux/rwlock_types_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/rwlock_types_rt.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rwlock_types_rt.h linux-4.9.22/include/linux/rwlock_types_rt.h
+--- linux-4.9.22.orig/include/linux/rwlock_types_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/rwlock_types_rt.h 2017-04-18 17:19:16.670772765 +0200
@@ -0,0 +1,33 @@
+#ifndef __LINUX_RWLOCK_TYPES_RT_H
+#define __LINUX_RWLOCK_TYPES_RT_H
@@ -8514,9 +8780,9 @@ diff -Nur linux-4.9.6.orig/include/linux/rwlock_types_rt.h linux-4.9.6/include/l
+ rwlock_t name = __RW_LOCK_UNLOCKED(name)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/rwsem.h linux-4.9.6/include/linux/rwsem.h
---- linux-4.9.6.orig/include/linux/rwsem.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/rwsem.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/rwsem.h linux-4.9.22/include/linux/rwsem.h
+--- linux-4.9.22.orig/include/linux/rwsem.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/rwsem.h 2017-04-18 17:19:16.670772765 +0200
@@ -19,6 +19,10 @@
#include <linux/osq_lock.h>
#endif
@@ -8528,17 +8794,24 @@ diff -Nur linux-4.9.6.orig/include/linux/rwsem.h linux-4.9.6/include/linux/rwsem
struct rw_semaphore;
#ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
-@@ -184,4 +188,6 @@
- # define up_read_non_owner(sem) up_read(sem)
- #endif
+@@ -106,6 +110,13 @@
+ return !list_empty(&sem->wait_list);
+ }
+#endif /* !PREEMPT_RT_FULL */
+
- #endif /* _LINUX_RWSEM_H */
-diff -Nur linux-4.9.6.orig/include/linux/rwsem_rt.h linux-4.9.6/include/linux/rwsem_rt.h
---- linux-4.9.6.orig/include/linux/rwsem_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/rwsem_rt.h 2017-01-28 13:59:09.943656649 +0100
-@@ -0,0 +1,167 @@
++/*
++ * The functions below are the same for all rwsem implementations including
++ * the RT specific variant.
++ */
++
+ /*
+ * lock for reading
+ */
+diff -Nur linux-4.9.22.orig/include/linux/rwsem_rt.h linux-4.9.22/include/linux/rwsem_rt.h
+--- linux-4.9.22.orig/include/linux/rwsem_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/rwsem_rt.h 2017-04-18 17:19:16.670772765 +0200
+@@ -0,0 +1,67 @@
+#ifndef _LINUX_RWSEM_RT_H
+#define _LINUX_RWSEM_RT_H
+
@@ -8546,169 +8819,69 @@ diff -Nur linux-4.9.6.orig/include/linux/rwsem_rt.h linux-4.9.6/include/linux/rw
+#error "Include rwsem.h"
+#endif
+
-+/*
-+ * RW-semaphores are a spinlock plus a reader-depth count.
-+ *
-+ * Note that the semantics are different from the usual
-+ * Linux rw-sems, in PREEMPT_RT mode we do not allow
-+ * multiple readers to hold the lock at once, we only allow
-+ * a read-lock owner to read-lock recursively. This is
-+ * better for latency, makes the implementation inherently
-+ * fair and makes it simpler as well.
-+ */
-+
+#include <linux/rtmutex.h>
++#include <linux/swait.h>
++
++#define READER_BIAS (1U << 31)
++#define WRITER_BIAS (1U << 30)
+
+struct rw_semaphore {
-+ struct rt_mutex lock;
-+ int read_depth;
++ atomic_t readers;
++ struct rt_mutex rtmutex;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+ struct lockdep_map dep_map;
+#endif
+};
+
-+#define __RWSEM_INITIALIZER(name) \
-+ { .lock = __RT_MUTEX_INITIALIZER(name.lock), \
-+ RW_DEP_MAP_INIT(name) }
++#define __RWSEM_INITIALIZER(name) \
++{ \
++ .readers = ATOMIC_INIT(READER_BIAS), \
++ .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \
++ RW_DEP_MAP_INIT(name) \
++}
+
+#define DECLARE_RWSEM(lockname) \
+ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname)
+
-+extern void __rt_rwsem_init(struct rw_semaphore *rwsem, const char *name,
-+ struct lock_class_key *key);
++extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name,
++ struct lock_class_key *key);
+
-+#define __rt_init_rwsem(sem, name, key) \
-+ do { \
-+ rt_mutex_init(&(sem)->lock); \
-+ __rt_rwsem_init((sem), (name), (key));\
-+ } while (0)
-+
-+#define __init_rwsem(sem, name, key) __rt_init_rwsem(sem, name, key)
++#define __init_rwsem(sem, name, key) \
++do { \
++ rt_mutex_init(&(sem)->rtmutex); \
++ __rwsem_init((sem), (name), (key)); \
++} while (0)
+
-+# define rt_init_rwsem(sem) \
++#define init_rwsem(sem) \
+do { \
+ static struct lock_class_key __key; \
+ \
-+ __rt_init_rwsem((sem), #sem, &__key); \
++ __init_rwsem((sem), #sem, &__key); \
+} while (0)
+
-+extern void rt_down_write(struct rw_semaphore *rwsem);
-+extern int rt_down_write_killable(struct rw_semaphore *rwsem);
-+extern void rt_down_read_nested(struct rw_semaphore *rwsem, int subclass);
-+extern void rt_down_write_nested(struct rw_semaphore *rwsem, int subclass);
-+extern int rt_down_write_killable_nested(struct rw_semaphore *rwsem,
-+ int subclass);
-+extern void rt_down_write_nested_lock(struct rw_semaphore *rwsem,
-+ struct lockdep_map *nest);
-+extern void rt__down_read(struct rw_semaphore *rwsem);
-+extern void rt_down_read(struct rw_semaphore *rwsem);
-+extern int rt_down_write_trylock(struct rw_semaphore *rwsem);
-+extern int rt__down_read_trylock(struct rw_semaphore *rwsem);
-+extern int rt_down_read_trylock(struct rw_semaphore *rwsem);
-+extern void __rt_up_read(struct rw_semaphore *rwsem);
-+extern void rt_up_read(struct rw_semaphore *rwsem);
-+extern void rt_up_write(struct rw_semaphore *rwsem);
-+extern void rt_downgrade_write(struct rw_semaphore *rwsem);
-+
-+#define init_rwsem(sem) rt_init_rwsem(sem)
-+#define rwsem_is_locked(s) rt_mutex_is_locked(&(s)->lock)
-+
-+static inline int rwsem_is_contended(struct rw_semaphore *sem)
-+{
-+ /* rt_mutex_has_waiters() */
-+ return !RB_EMPTY_ROOT(&sem->lock.waiters);
-+}
-+
-+static inline void __down_read(struct rw_semaphore *sem)
-+{
-+ rt__down_read(sem);
-+}
-+
-+static inline void down_read(struct rw_semaphore *sem)
-+{
-+ rt_down_read(sem);
-+}
-+
-+static inline int __down_read_trylock(struct rw_semaphore *sem)
-+{
-+ return rt__down_read_trylock(sem);
-+}
-+
-+static inline int down_read_trylock(struct rw_semaphore *sem)
-+{
-+ return rt_down_read_trylock(sem);
-+}
-+
-+static inline void down_write(struct rw_semaphore *sem)
-+{
-+ rt_down_write(sem);
-+}
-+
-+static inline int down_write_killable(struct rw_semaphore *sem)
++static inline int rwsem_is_locked(struct rw_semaphore *sem)
+{
-+ return rt_down_write_killable(sem);
++ return atomic_read(&sem->readers) != READER_BIAS;
+}
+
-+static inline int down_write_trylock(struct rw_semaphore *sem)
-+{
-+ return rt_down_write_trylock(sem);
-+}
-+
-+static inline void __up_read(struct rw_semaphore *sem)
-+{
-+ __rt_up_read(sem);
-+}
-+
-+static inline void up_read(struct rw_semaphore *sem)
-+{
-+ rt_up_read(sem);
-+}
-+
-+static inline void up_write(struct rw_semaphore *sem)
-+{
-+ rt_up_write(sem);
-+}
-+
-+static inline void downgrade_write(struct rw_semaphore *sem)
-+{
-+ rt_downgrade_write(sem);
-+}
-+
-+static inline void down_read_nested(struct rw_semaphore *sem, int subclass)
-+{
-+ return rt_down_read_nested(sem, subclass);
-+}
-+
-+static inline void down_write_nested(struct rw_semaphore *sem, int subclass)
-+{
-+ rt_down_write_nested(sem, subclass);
-+}
-+
-+static inline int down_write_killable_nested(struct rw_semaphore *sem,
-+ int subclass)
-+{
-+ return rt_down_write_killable_nested(sem, subclass);
-+}
-+
-+#ifdef CONFIG_DEBUG_LOCK_ALLOC
-+static inline void down_write_nest_lock(struct rw_semaphore *sem,
-+ struct rw_semaphore *nest_lock)
++static inline int rwsem_is_contended(struct rw_semaphore *sem)
+{
-+ rt_down_write_nested_lock(sem, &nest_lock->dep_map);
++ return atomic_read(&sem->readers) > 0;
+}
+
-+#else
++extern void __down_read(struct rw_semaphore *sem);
++extern int __down_read_trylock(struct rw_semaphore *sem);
++extern void __down_write(struct rw_semaphore *sem);
++extern int __must_check __down_write_killable(struct rw_semaphore *sem);
++extern int __down_write_trylock(struct rw_semaphore *sem);
++extern void __up_read(struct rw_semaphore *sem);
++extern void __up_write(struct rw_semaphore *sem);
++extern void __downgrade_write(struct rw_semaphore *sem);
+
-+static inline void down_write_nest_lock(struct rw_semaphore *sem,
-+ struct rw_semaphore *nest_lock)
-+{
-+ rt_down_write_nested_lock(sem, NULL);
-+}
-+#endif
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/sched.h linux-4.9.6/include/linux/sched.h
---- linux-4.9.6.orig/include/linux/sched.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/sched.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/sched.h linux-4.9.22/include/linux/sched.h
+--- linux-4.9.22.orig/include/linux/sched.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/sched.h 2017-04-18 17:19:16.670772765 +0200
@@ -26,6 +26,7 @@
#include <linux/nodemask.h>
#include <linux/mm_types.h>
@@ -9084,9 +9257,9 @@ diff -Nur linux-4.9.6.orig/include/linux/sched.h linux-4.9.6/include/linux/sched
extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask);
extern long sched_getaffinity(pid_t pid, struct cpumask *mask);
-diff -Nur linux-4.9.6.orig/include/linux/seqlock.h linux-4.9.6/include/linux/seqlock.h
---- linux-4.9.6.orig/include/linux/seqlock.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/seqlock.h 2017-01-28 13:59:09.943656649 +0100
+diff -Nur linux-4.9.22.orig/include/linux/seqlock.h linux-4.9.22/include/linux/seqlock.h
+--- linux-4.9.22.orig/include/linux/seqlock.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/seqlock.h 2017-04-18 17:19:16.670772765 +0200
@@ -220,20 +220,30 @@
return __read_seqcount_retry(s, start);
}
@@ -9225,9 +9398,9 @@ diff -Nur linux-4.9.6.orig/include/linux/seqlock.h linux-4.9.6/include/linux/seq
spin_unlock_irqrestore(&sl->lock, flags);
}
-diff -Nur linux-4.9.6.orig/include/linux/signal.h linux-4.9.6/include/linux/signal.h
---- linux-4.9.6.orig/include/linux/signal.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/signal.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/signal.h linux-4.9.22/include/linux/signal.h
+--- linux-4.9.22.orig/include/linux/signal.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/signal.h 2017-04-18 17:19:16.670772765 +0200
@@ -233,6 +233,7 @@
}
@@ -9236,9 +9409,9 @@ diff -Nur linux-4.9.6.orig/include/linux/signal.h linux-4.9.6/include/linux/sign
/* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */
static inline int valid_signal(unsigned long sig)
-diff -Nur linux-4.9.6.orig/include/linux/skbuff.h linux-4.9.6/include/linux/skbuff.h
---- linux-4.9.6.orig/include/linux/skbuff.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/skbuff.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/skbuff.h linux-4.9.22/include/linux/skbuff.h
+--- linux-4.9.22.orig/include/linux/skbuff.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/skbuff.h 2017-04-18 17:19:16.674772920 +0200
@@ -284,6 +284,7 @@
__u32 qlen;
@@ -9260,10 +9433,36 @@ diff -Nur linux-4.9.6.orig/include/linux/skbuff.h linux-4.9.6/include/linux/skbu
static inline void skb_queue_head_init_class(struct sk_buff_head *list,
struct lock_class_key *class)
{
-diff -Nur linux-4.9.6.orig/include/linux/smp.h linux-4.9.6/include/linux/smp.h
---- linux-4.9.6.orig/include/linux/smp.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/smp.h 2017-01-28 13:59:09.947656802 +0100
-@@ -185,6 +185,9 @@
+diff -Nur linux-4.9.22.orig/include/linux/smp.h linux-4.9.22/include/linux/smp.h
+--- linux-4.9.22.orig/include/linux/smp.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/smp.h 2017-04-18 17:19:16.674772920 +0200
+@@ -120,6 +120,13 @@
+ extern void __init setup_nr_cpu_ids(void);
+ extern void __init smp_init(void);
+
++extern int __boot_cpu_id;
++
++static inline int get_boot_cpu_id(void)
++{
++ return __boot_cpu_id;
++}
++
+ #else /* !SMP */
+
+ static inline void smp_send_stop(void) { }
+@@ -158,6 +165,11 @@
+ static inline void smp_init(void) { }
+ #endif
+
++static inline int get_boot_cpu_id(void)
++{
++ return 0;
++}
++
+ #endif /* !SMP */
+
+ /*
+@@ -185,6 +197,9 @@
#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
#define put_cpu() preempt_enable()
@@ -9273,9 +9472,9 @@ diff -Nur linux-4.9.6.orig/include/linux/smp.h linux-4.9.6/include/linux/smp.h
/*
* Callback to arch code if there's nosmp or maxcpus=0 on the
* boot command line:
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_api_smp.h linux-4.9.6/include/linux/spinlock_api_smp.h
---- linux-4.9.6.orig/include/linux/spinlock_api_smp.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_api_smp.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_api_smp.h linux-4.9.22/include/linux/spinlock_api_smp.h
+--- linux-4.9.22.orig/include/linux/spinlock_api_smp.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/spinlock_api_smp.h 2017-04-18 17:19:16.674772920 +0200
@@ -189,6 +189,8 @@
return 0;
}
@@ -9286,9 +9485,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_api_smp.h linux-4.9.6/include/
+#endif
#endif /* __LINUX_SPINLOCK_API_SMP_H */
-diff -Nur linux-4.9.6.orig/include/linux/spinlock.h linux-4.9.6/include/linux/spinlock.h
---- linux-4.9.6.orig/include/linux/spinlock.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock.h linux-4.9.22/include/linux/spinlock.h
+--- linux-4.9.22.orig/include/linux/spinlock.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/spinlock.h 2017-04-18 17:19:16.674772920 +0200
@@ -271,7 +271,11 @@
#define raw_spin_can_lock(lock) (!raw_spin_is_locked(lock))
@@ -9313,30 +9512,17 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock.h linux-4.9.6/include/linux/sp
/*
* Map the spin_lock functions to the raw variants for PREEMPT_RT=n
*/
-@@ -347,6 +355,12 @@
- raw_spin_unlock(&lock->rlock);
- }
-
-+static __always_inline int spin_unlock_no_deboost(spinlock_t *lock)
-+{
-+ raw_spin_unlock(&lock->rlock);
-+ return 0;
-+}
-+
- static __always_inline void spin_unlock_bh(spinlock_t *lock)
- {
- raw_spin_unlock_bh(&lock->rlock);
-@@ -416,4 +430,6 @@
+@@ -416,4 +424,6 @@
#define atomic_dec_and_lock(atomic, lock) \
__cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
+#endif /* !PREEMPT_RT_FULL */
+
#endif /* __LINUX_SPINLOCK_H */
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_rt.h linux-4.9.6/include/linux/spinlock_rt.h
---- linux-4.9.6.orig/include/linux/spinlock_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_rt.h 2017-01-28 13:59:09.947656802 +0100
-@@ -0,0 +1,164 @@
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_rt.h linux-4.9.22/include/linux/spinlock_rt.h
+--- linux-4.9.22.orig/include/linux/spinlock_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/spinlock_rt.h 2017-04-18 17:19:16.674772920 +0200
+@@ -0,0 +1,162 @@
+#ifndef __LINUX_SPINLOCK_RT_H
+#define __LINUX_SPINLOCK_RT_H
+
@@ -9365,7 +9551,6 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_rt.h linux-4.9.6/include/linux
+extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock);
+extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass);
+extern void __lockfunc rt_spin_unlock(spinlock_t *lock);
-+extern int __lockfunc rt_spin_unlock_no_deboost(spinlock_t *lock);
+extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock);
+extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags);
+extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock);
@@ -9451,7 +9636,6 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_rt.h linux-4.9.6/include/linux
+#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0)
+
+#define spin_unlock(lock) rt_spin_unlock(lock)
-+#define spin_unlock_no_deboost(lock) rt_spin_unlock_no_deboost(lock)
+
+#define spin_unlock_bh(lock) \
+ do { \
@@ -9501,9 +9685,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_rt.h linux-4.9.6/include/linux
+ atomic_dec_and_spin_lock(atomic, lock)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_types.h linux-4.9.6/include/linux/spinlock_types.h
---- linux-4.9.6.orig/include/linux/spinlock_types.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_types.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_types.h linux-4.9.22/include/linux/spinlock_types.h
+--- linux-4.9.22.orig/include/linux/spinlock_types.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/spinlock_types.h 2017-04-18 17:19:16.674772920 +0200
@@ -9,80 +9,15 @@
* Released under the General Public License (GPL).
*/
@@ -9592,9 +9776,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_types.h linux-4.9.6/include/li
-#include <linux/rwlock_types.h>
-
#endif /* __LINUX_SPINLOCK_TYPES_H */
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_nort.h linux-4.9.6/include/linux/spinlock_types_nort.h
---- linux-4.9.6.orig/include/linux/spinlock_types_nort.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_types_nort.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_types_nort.h linux-4.9.22/include/linux/spinlock_types_nort.h
+--- linux-4.9.22.orig/include/linux/spinlock_types_nort.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/spinlock_types_nort.h 2017-04-18 17:19:16.674772920 +0200
@@ -0,0 +1,33 @@
+#ifndef __LINUX_SPINLOCK_TYPES_NORT_H
+#define __LINUX_SPINLOCK_TYPES_NORT_H
@@ -9629,9 +9813,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_nort.h linux-4.9.6/inclu
+#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_raw.h linux-4.9.6/include/linux/spinlock_types_raw.h
---- linux-4.9.6.orig/include/linux/spinlock_types_raw.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_types_raw.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_types_raw.h linux-4.9.22/include/linux/spinlock_types_raw.h
+--- linux-4.9.22.orig/include/linux/spinlock_types_raw.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/spinlock_types_raw.h 2017-04-18 17:19:16.674772920 +0200
@@ -0,0 +1,56 @@
+#ifndef __LINUX_SPINLOCK_TYPES_RAW_H
+#define __LINUX_SPINLOCK_TYPES_RAW_H
@@ -9689,9 +9873,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_raw.h linux-4.9.6/includ
+#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_rt.h linux-4.9.6/include/linux/spinlock_types_rt.h
---- linux-4.9.6.orig/include/linux/spinlock_types_rt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/spinlock_types_rt.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/spinlock_types_rt.h linux-4.9.22/include/linux/spinlock_types_rt.h
+--- linux-4.9.22.orig/include/linux/spinlock_types_rt.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/spinlock_types_rt.h 2017-04-18 17:19:16.674772920 +0200
@@ -0,0 +1,48 @@
+#ifndef __LINUX_SPINLOCK_TYPES_RT_H
+#define __LINUX_SPINLOCK_TYPES_RT_H
@@ -9741,9 +9925,9 @@ diff -Nur linux-4.9.6.orig/include/linux/spinlock_types_rt.h linux-4.9.6/include
+ spinlock_t name = __SPIN_LOCK_UNLOCKED(name)
+
+#endif
-diff -Nur linux-4.9.6.orig/include/linux/srcu.h linux-4.9.6/include/linux/srcu.h
---- linux-4.9.6.orig/include/linux/srcu.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/srcu.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/srcu.h linux-4.9.22/include/linux/srcu.h
+--- linux-4.9.22.orig/include/linux/srcu.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/srcu.h 2017-04-18 17:19:16.674772920 +0200
@@ -84,10 +84,10 @@
void process_srcu(struct work_struct *work);
@@ -9766,9 +9950,9 @@ diff -Nur linux-4.9.6.orig/include/linux/srcu.h linux-4.9.6/include/linux/srcu.h
#define DEFINE_SRCU(name) __DEFINE_SRCU(name, /* not static */)
#define DEFINE_STATIC_SRCU(name) __DEFINE_SRCU(name, static)
-diff -Nur linux-4.9.6.orig/include/linux/suspend.h linux-4.9.6/include/linux/suspend.h
---- linux-4.9.6.orig/include/linux/suspend.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/suspend.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/suspend.h linux-4.9.22/include/linux/suspend.h
+--- linux-4.9.22.orig/include/linux/suspend.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/suspend.h 2017-04-18 17:19:16.674772920 +0200
@@ -193,6 +193,12 @@
void (*end)(void);
};
@@ -9782,9 +9966,9 @@ diff -Nur linux-4.9.6.orig/include/linux/suspend.h linux-4.9.6/include/linux/sus
#ifdef CONFIG_SUSPEND
/**
* suspend_set_ops - set platform dependent suspend operations
-diff -Nur linux-4.9.6.orig/include/linux/swait.h linux-4.9.6/include/linux/swait.h
---- linux-4.9.6.orig/include/linux/swait.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/swait.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/swait.h linux-4.9.22/include/linux/swait.h
+--- linux-4.9.22.orig/include/linux/swait.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/swait.h 2017-04-18 17:19:16.674772920 +0200
@@ -87,6 +87,7 @@
extern void swake_up(struct swait_queue_head *q);
extern void swake_up_all(struct swait_queue_head *q);
@@ -9793,9 +9977,9 @@ diff -Nur linux-4.9.6.orig/include/linux/swait.h linux-4.9.6/include/linux/swait
extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
extern void prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait, int state);
-diff -Nur linux-4.9.6.orig/include/linux/swap.h linux-4.9.6/include/linux/swap.h
---- linux-4.9.6.orig/include/linux/swap.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/swap.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/swap.h linux-4.9.22/include/linux/swap.h
+--- linux-4.9.22.orig/include/linux/swap.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/swap.h 2017-04-18 17:19:16.674772920 +0200
@@ -11,6 +11,7 @@
#include <linux/fs.h>
#include <linux/atomic.h>
@@ -9822,9 +10006,9 @@ diff -Nur linux-4.9.6.orig/include/linux/swap.h linux-4.9.6/include/linux/swap.h
extern void lru_cache_add(struct page *);
extern void lru_cache_add_anon(struct page *page);
extern void lru_cache_add_file(struct page *page);
-diff -Nur linux-4.9.6.orig/include/linux/swork.h linux-4.9.6/include/linux/swork.h
---- linux-4.9.6.orig/include/linux/swork.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/linux/swork.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/swork.h linux-4.9.22/include/linux/swork.h
+--- linux-4.9.22.orig/include/linux/swork.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/linux/swork.h 2017-04-18 17:19:16.674772920 +0200
@@ -0,0 +1,24 @@
+#ifndef _LINUX_SWORK_H
+#define _LINUX_SWORK_H
@@ -9850,9 +10034,9 @@ diff -Nur linux-4.9.6.orig/include/linux/swork.h linux-4.9.6/include/linux/swork
+void swork_put(void);
+
+#endif /* _LINUX_SWORK_H */
-diff -Nur linux-4.9.6.orig/include/linux/thread_info.h linux-4.9.6/include/linux/thread_info.h
---- linux-4.9.6.orig/include/linux/thread_info.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/thread_info.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/thread_info.h linux-4.9.22/include/linux/thread_info.h
+--- linux-4.9.22.orig/include/linux/thread_info.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/thread_info.h 2017-04-18 17:19:16.678773075 +0200
@@ -107,7 +107,17 @@
#define test_thread_flag(flag) \
test_ti_thread_flag(current_thread_info(), flag)
@@ -9872,9 +10056,9 @@ diff -Nur linux-4.9.6.orig/include/linux/thread_info.h linux-4.9.6/include/linux
#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
static inline int arch_within_stack_frames(const void * const stack,
-diff -Nur linux-4.9.6.orig/include/linux/timer.h linux-4.9.6/include/linux/timer.h
---- linux-4.9.6.orig/include/linux/timer.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/timer.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/timer.h linux-4.9.22/include/linux/timer.h
+--- linux-4.9.22.orig/include/linux/timer.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/timer.h 2017-04-18 17:19:16.678773075 +0200
@@ -241,7 +241,7 @@
extern int try_to_del_timer_sync(struct timer_list *timer);
@@ -9884,9 +10068,9 @@ diff -Nur linux-4.9.6.orig/include/linux/timer.h linux-4.9.6/include/linux/timer
extern int del_timer_sync(struct timer_list *timer);
#else
# define del_timer_sync(t) del_timer(t)
-diff -Nur linux-4.9.6.orig/include/linux/trace_events.h linux-4.9.6/include/linux/trace_events.h
---- linux-4.9.6.orig/include/linux/trace_events.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/trace_events.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/trace_events.h linux-4.9.22/include/linux/trace_events.h
+--- linux-4.9.22.orig/include/linux/trace_events.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/trace_events.h 2017-04-18 17:19:16.678773075 +0200
@@ -56,6 +56,9 @@
unsigned char flags;
unsigned char preempt_count;
@@ -9897,9 +10081,9 @@ diff -Nur linux-4.9.6.orig/include/linux/trace_events.h linux-4.9.6/include/linu
};
#define TRACE_EVENT_TYPE_MAX \
-diff -Nur linux-4.9.6.orig/include/linux/uaccess.h linux-4.9.6/include/linux/uaccess.h
---- linux-4.9.6.orig/include/linux/uaccess.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/uaccess.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/uaccess.h linux-4.9.22/include/linux/uaccess.h
+--- linux-4.9.22.orig/include/linux/uaccess.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/uaccess.h 2017-04-18 17:19:16.678773075 +0200
@@ -24,6 +24,7 @@
*/
static inline void pagefault_disable(void)
@@ -9916,9 +10100,9 @@ diff -Nur linux-4.9.6.orig/include/linux/uaccess.h linux-4.9.6/include/linux/uac
}
/*
-diff -Nur linux-4.9.6.orig/include/linux/uprobes.h linux-4.9.6/include/linux/uprobes.h
---- linux-4.9.6.orig/include/linux/uprobes.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/uprobes.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/uprobes.h linux-4.9.22/include/linux/uprobes.h
+--- linux-4.9.22.orig/include/linux/uprobes.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/uprobes.h 2017-04-18 17:19:16.678773075 +0200
@@ -27,6 +27,7 @@
#include <linux/errno.h>
#include <linux/rbtree.h>
@@ -9927,9 +10111,9 @@ diff -Nur linux-4.9.6.orig/include/linux/uprobes.h linux-4.9.6/include/linux/upr
struct vm_area_struct;
struct mm_struct;
-diff -Nur linux-4.9.6.orig/include/linux/vmstat.h linux-4.9.6/include/linux/vmstat.h
---- linux-4.9.6.orig/include/linux/vmstat.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/vmstat.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/vmstat.h linux-4.9.22/include/linux/vmstat.h
+--- linux-4.9.22.orig/include/linux/vmstat.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/vmstat.h 2017-04-18 17:19:16.678773075 +0200
@@ -33,7 +33,9 @@
*/
static inline void __count_vm_event(enum vm_event_item item)
@@ -9950,9 +10134,9 @@ diff -Nur linux-4.9.6.orig/include/linux/vmstat.h linux-4.9.6/include/linux/vmst
}
static inline void count_vm_events(enum vm_event_item item, long delta)
-diff -Nur linux-4.9.6.orig/include/linux/wait.h linux-4.9.6/include/linux/wait.h
---- linux-4.9.6.orig/include/linux/wait.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/linux/wait.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/linux/wait.h linux-4.9.22/include/linux/wait.h
+--- linux-4.9.22.orig/include/linux/wait.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/linux/wait.h 2017-04-18 17:19:16.678773075 +0200
@@ -8,6 +8,7 @@
#include <linux/spinlock.h>
#include <asm/current.h>
@@ -9961,9 +10145,9 @@ diff -Nur linux-4.9.6.orig/include/linux/wait.h linux-4.9.6/include/linux/wait.h
typedef struct __wait_queue wait_queue_t;
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int flags, void *key);
-diff -Nur linux-4.9.6.orig/include/net/dst.h linux-4.9.6/include/net/dst.h
---- linux-4.9.6.orig/include/net/dst.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/net/dst.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/net/dst.h linux-4.9.22/include/net/dst.h
+--- linux-4.9.22.orig/include/net/dst.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/net/dst.h 2017-04-18 17:19:16.678773075 +0200
@@ -446,7 +446,7 @@
static inline int dst_neigh_output(struct dst_entry *dst, struct neighbour *n,
struct sk_buff *skb)
@@ -9973,9 +10157,9 @@ diff -Nur linux-4.9.6.orig/include/net/dst.h linux-4.9.6/include/net/dst.h
if (dst->pending_confirm) {
unsigned long now = jiffies;
-diff -Nur linux-4.9.6.orig/include/net/gen_stats.h linux-4.9.6/include/net/gen_stats.h
---- linux-4.9.6.orig/include/net/gen_stats.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/net/gen_stats.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/net/gen_stats.h linux-4.9.22/include/net/gen_stats.h
+--- linux-4.9.22.orig/include/net/gen_stats.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/net/gen_stats.h 2017-04-18 17:19:16.678773075 +0200
@@ -5,6 +5,7 @@
#include <linux/socket.h>
#include <linux/rtnetlink.h>
@@ -10015,9 +10199,9 @@ diff -Nur linux-4.9.6.orig/include/net/gen_stats.h linux-4.9.6/include/net/gen_s
bool gen_estimator_active(const struct gnet_stats_basic_packed *bstats,
const struct gnet_stats_rate_est64 *rate_est);
#endif
-diff -Nur linux-4.9.6.orig/include/net/neighbour.h linux-4.9.6/include/net/neighbour.h
---- linux-4.9.6.orig/include/net/neighbour.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/net/neighbour.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/net/neighbour.h linux-4.9.22/include/net/neighbour.h
+--- linux-4.9.22.orig/include/net/neighbour.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/net/neighbour.h 2017-04-18 17:19:16.678773075 +0200
@@ -446,7 +446,7 @@
}
#endif
@@ -10036,9 +10220,9 @@ diff -Nur linux-4.9.6.orig/include/net/neighbour.h linux-4.9.6/include/net/neigh
const struct net_device *dev)
{
unsigned int seq;
-diff -Nur linux-4.9.6.orig/include/net/netns/ipv4.h linux-4.9.6/include/net/netns/ipv4.h
---- linux-4.9.6.orig/include/net/netns/ipv4.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/net/netns/ipv4.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/net/netns/ipv4.h linux-4.9.22/include/net/netns/ipv4.h
+--- linux-4.9.22.orig/include/net/netns/ipv4.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/net/netns/ipv4.h 2017-04-18 17:19:16.678773075 +0200
@@ -69,6 +69,7 @@
int sysctl_icmp_echo_ignore_all;
@@ -10047,9 +10231,9 @@ diff -Nur linux-4.9.6.orig/include/net/netns/ipv4.h linux-4.9.6/include/net/netn
int sysctl_icmp_ignore_bogus_error_responses;
int sysctl_icmp_ratelimit;
int sysctl_icmp_ratemask;
-diff -Nur linux-4.9.6.orig/include/net/net_seq_lock.h linux-4.9.6/include/net/net_seq_lock.h
---- linux-4.9.6.orig/include/net/net_seq_lock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/net/net_seq_lock.h 2017-01-28 13:59:09.947656802 +0100
+diff -Nur linux-4.9.22.orig/include/net/net_seq_lock.h linux-4.9.22/include/net/net_seq_lock.h
+--- linux-4.9.22.orig/include/net/net_seq_lock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/net/net_seq_lock.h 2017-04-18 17:19:16.678773075 +0200
@@ -0,0 +1,15 @@
+#ifndef __NET_NET_SEQ_LOCK_H__
+#define __NET_NET_SEQ_LOCK_H__
@@ -10066,9 +10250,9 @@ diff -Nur linux-4.9.6.orig/include/net/net_seq_lock.h linux-4.9.6/include/net/ne
+#endif
+
+#endif
-diff -Nur linux-4.9.6.orig/include/net/sch_generic.h linux-4.9.6/include/net/sch_generic.h
---- linux-4.9.6.orig/include/net/sch_generic.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/include/net/sch_generic.h 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/include/net/sch_generic.h linux-4.9.22/include/net/sch_generic.h
+--- linux-4.9.22.orig/include/net/sch_generic.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/include/net/sch_generic.h 2017-04-18 17:19:16.678773075 +0200
@@ -10,6 +10,7 @@
#include <linux/dynamic_queue_limits.h>
#include <net/gen_stats.h>
@@ -10136,9 +10320,9 @@ diff -Nur linux-4.9.6.orig/include/net/sch_generic.h linux-4.9.6/include/net/sch
{
struct Qdisc *root = qdisc_root_sleeping(qdisc);
-diff -Nur linux-4.9.6.orig/include/trace/events/hist.h linux-4.9.6/include/trace/events/hist.h
---- linux-4.9.6.orig/include/trace/events/hist.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/trace/events/hist.h 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/include/trace/events/hist.h linux-4.9.22/include/trace/events/hist.h
+--- linux-4.9.22.orig/include/trace/events/hist.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/trace/events/hist.h 2017-04-18 17:19:16.678773075 +0200
@@ -0,0 +1,73 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM hist
@@ -10213,9 +10397,9 @@ diff -Nur linux-4.9.6.orig/include/trace/events/hist.h linux-4.9.6/include/trace
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
-diff -Nur linux-4.9.6.orig/include/trace/events/latency_hist.h linux-4.9.6/include/trace/events/latency_hist.h
---- linux-4.9.6.orig/include/trace/events/latency_hist.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/include/trace/events/latency_hist.h 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/include/trace/events/latency_hist.h linux-4.9.22/include/trace/events/latency_hist.h
+--- linux-4.9.22.orig/include/trace/events/latency_hist.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/include/trace/events/latency_hist.h 2017-04-18 17:19:16.678773075 +0200
@@ -0,0 +1,29 @@
+#ifndef _LATENCY_HIST_H
+#define _LATENCY_HIST_H
@@ -10246,9 +10430,9 @@ diff -Nur linux-4.9.6.orig/include/trace/events/latency_hist.h linux-4.9.6/inclu
+}
+
+#endif /* _LATENCY_HIST_H */
-diff -Nur linux-4.9.6.orig/init/Kconfig linux-4.9.6/init/Kconfig
---- linux-4.9.6.orig/init/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/init/Kconfig 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/init/Kconfig linux-4.9.22/init/Kconfig
+--- linux-4.9.22.orig/init/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/init/Kconfig 2017-04-18 17:19:16.678773075 +0200
@@ -506,7 +506,7 @@
config RCU_EXPERT
@@ -10329,9 +10513,9 @@ diff -Nur linux-4.9.6.orig/init/Kconfig linux-4.9.6/init/Kconfig
bool "SLUB per cpu partial cache"
help
Per cpu partial caches accellerate objects allocation and freeing
-diff -Nur linux-4.9.6.orig/init/main.c linux-4.9.6/init/main.c
---- linux-4.9.6.orig/init/main.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/init/main.c 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/init/main.c linux-4.9.22/init/main.c
+--- linux-4.9.22.orig/init/main.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/init/main.c 2017-04-18 17:19:16.682773230 +0200
@@ -507,6 +507,7 @@
setup_command_line(command_line);
setup_nr_cpu_ids();
@@ -10340,18 +10524,18 @@ diff -Nur linux-4.9.6.orig/init/main.c linux-4.9.6/init/main.c
boot_cpu_state_init();
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
-diff -Nur linux-4.9.6.orig/init/Makefile linux-4.9.6/init/Makefile
---- linux-4.9.6.orig/init/Makefile 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/init/Makefile 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/init/Makefile linux-4.9.22/init/Makefile
+--- linux-4.9.22.orig/init/Makefile 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/init/Makefile 2017-04-18 17:19:16.678773075 +0200
@@ -35,4 +35,4 @@
include/generated/compile.h: FORCE
@$($(quiet)chk_compile.h)
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
- "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)"
+ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)" "$(CC) $(KBUILD_CFLAGS)"
-diff -Nur linux-4.9.6.orig/ipc/sem.c linux-4.9.6/ipc/sem.c
---- linux-4.9.6.orig/ipc/sem.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/ipc/sem.c 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/ipc/sem.c linux-4.9.22/ipc/sem.c
+--- linux-4.9.22.orig/ipc/sem.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/ipc/sem.c 2017-04-18 17:19:16.682773230 +0200
@@ -712,6 +712,13 @@
static void wake_up_sem_queue_prepare(struct list_head *pt,
struct sem_queue *q, int error)
@@ -10390,9 +10574,9 @@ diff -Nur linux-4.9.6.orig/ipc/sem.c linux-4.9.6/ipc/sem.c
}
static void unlink_queue(struct sem_array *sma, struct sem_queue *q)
-diff -Nur linux-4.9.6.orig/kernel/cgroup.c linux-4.9.6/kernel/cgroup.c
---- linux-4.9.6.orig/kernel/cgroup.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/cgroup.c 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/kernel/cgroup.c linux-4.9.22/kernel/cgroup.c
+--- linux-4.9.22.orig/kernel/cgroup.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/cgroup.c 2017-04-18 17:19:16.682773230 +0200
@@ -5040,10 +5040,10 @@
queue_work(cgroup_destroy_wq, &css->destroy_work);
}
@@ -10417,7 +10601,7 @@ diff -Nur linux-4.9.6.orig/kernel/cgroup.c linux-4.9.6/kernel/cgroup.c
}
static void init_and_link_css(struct cgroup_subsys_state *css,
-@@ -5742,6 +5742,7 @@
+@@ -5739,6 +5739,7 @@
*/
cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1);
BUG_ON(!cgroup_destroy_wq);
@@ -10425,9 +10609,9 @@ diff -Nur linux-4.9.6.orig/kernel/cgroup.c linux-4.9.6/kernel/cgroup.c
/*
* Used to destroy pidlists and separate to serve as flush domain.
-diff -Nur linux-4.9.6.orig/kernel/cpu.c linux-4.9.6/kernel/cpu.c
---- linux-4.9.6.orig/kernel/cpu.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/cpu.c 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/kernel/cpu.c linux-4.9.22/kernel/cpu.c
+--- linux-4.9.22.orig/kernel/cpu.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/cpu.c 2017-04-18 17:19:16.682773230 +0200
@@ -239,6 +239,289 @@
#define cpuhp_lock_acquire() lock_map_acquire(&cpu_hotplug.dep_map)
#define cpuhp_lock_release() lock_map_release(&cpu_hotplug.dep_map)
@@ -10794,9 +10978,266 @@ diff -Nur linux-4.9.6.orig/kernel/cpu.c linux-4.9.6/kernel/cpu.c
return ret;
}
-diff -Nur linux-4.9.6.orig/kernel/debug/kdb/kdb_io.c linux-4.9.6/kernel/debug/kdb/kdb_io.c
---- linux-4.9.6.orig/kernel/debug/kdb/kdb_io.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/debug/kdb/kdb_io.c 2017-01-28 13:59:09.951656955 +0100
+@@ -1240,6 +1562,8 @@
+
+ #endif /* CONFIG_PM_SLEEP_SMP */
+
++int __boot_cpu_id;
++
+ #endif /* CONFIG_SMP */
+
+ /* Boot processor state steps */
+@@ -1923,6 +2247,10 @@
+ set_cpu_active(cpu, true);
+ set_cpu_present(cpu, true);
+ set_cpu_possible(cpu, true);
++
++#ifdef CONFIG_SMP
++ __boot_cpu_id = cpu;
++#endif
+ }
+
+ /*
+diff -Nur linux-4.9.22.orig/kernel/cpuset.c linux-4.9.22/kernel/cpuset.c
+--- linux-4.9.22.orig/kernel/cpuset.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/cpuset.c 2017-04-18 17:19:16.682773230 +0200
+@@ -284,7 +284,7 @@
+ */
+
+ static DEFINE_MUTEX(cpuset_mutex);
+-static DEFINE_SPINLOCK(callback_lock);
++static DEFINE_RAW_SPINLOCK(callback_lock);
+
+ static struct workqueue_struct *cpuset_migrate_mm_wq;
+
+@@ -907,9 +907,9 @@
+ continue;
+ rcu_read_unlock();
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cpumask_copy(cp->effective_cpus, new_cpus);
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ WARN_ON(!cgroup_subsys_on_dfl(cpuset_cgrp_subsys) &&
+ !cpumask_equal(cp->cpus_allowed, cp->effective_cpus));
+@@ -974,9 +974,9 @@
+ if (retval < 0)
+ return retval;
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed);
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ /* use trialcs->cpus_allowed as a temp variable */
+ update_cpumasks_hier(cs, trialcs->cpus_allowed);
+@@ -1176,9 +1176,9 @@
+ continue;
+ rcu_read_unlock();
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cp->effective_mems = *new_mems;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ WARN_ON(!cgroup_subsys_on_dfl(cpuset_cgrp_subsys) &&
+ !nodes_equal(cp->mems_allowed, cp->effective_mems));
+@@ -1246,9 +1246,9 @@
+ if (retval < 0)
+ goto done;
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cs->mems_allowed = trialcs->mems_allowed;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ /* use trialcs->mems_allowed as a temp variable */
+ update_nodemasks_hier(cs, &trialcs->mems_allowed);
+@@ -1339,9 +1339,9 @@
+ spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs))
+ || (is_spread_page(cs) != is_spread_page(trialcs)));
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cs->flags = trialcs->flags;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed)
+ rebuild_sched_domains_locked();
+@@ -1756,7 +1756,7 @@
+ cpuset_filetype_t type = seq_cft(sf)->private;
+ int ret = 0;
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+
+ switch (type) {
+ case FILE_CPULIST:
+@@ -1775,7 +1775,7 @@
+ ret = -EINVAL;
+ }
+
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+ return ret;
+ }
+
+@@ -1989,12 +1989,12 @@
+
+ cpuset_inc();
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ if (cgroup_subsys_on_dfl(cpuset_cgrp_subsys)) {
+ cpumask_copy(cs->effective_cpus, parent->effective_cpus);
+ cs->effective_mems = parent->effective_mems;
+ }
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags))
+ goto out_unlock;
+@@ -2021,12 +2021,12 @@
+ }
+ rcu_read_unlock();
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cs->mems_allowed = parent->mems_allowed;
+ cs->effective_mems = parent->mems_allowed;
+ cpumask_copy(cs->cpus_allowed, parent->cpus_allowed);
+ cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+ out_unlock:
+ mutex_unlock(&cpuset_mutex);
+ return 0;
+@@ -2065,7 +2065,7 @@
+ static void cpuset_bind(struct cgroup_subsys_state *root_css)
+ {
+ mutex_lock(&cpuset_mutex);
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+
+ if (cgroup_subsys_on_dfl(cpuset_cgrp_subsys)) {
+ cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask);
+@@ -2076,7 +2076,7 @@
+ top_cpuset.mems_allowed = top_cpuset.effective_mems;
+ }
+
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+ mutex_unlock(&cpuset_mutex);
+ }
+
+@@ -2177,12 +2177,12 @@
+ {
+ bool is_empty;
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cpumask_copy(cs->cpus_allowed, new_cpus);
+ cpumask_copy(cs->effective_cpus, new_cpus);
+ cs->mems_allowed = *new_mems;
+ cs->effective_mems = *new_mems;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ /*
+ * Don't call update_tasks_cpumask() if the cpuset becomes empty,
+@@ -2219,10 +2219,10 @@
+ if (nodes_empty(*new_mems))
+ *new_mems = parent_cs(cs)->effective_mems;
+
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ cpumask_copy(cs->effective_cpus, new_cpus);
+ cs->effective_mems = *new_mems;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+
+ if (cpus_updated)
+ update_tasks_cpumask(cs);
+@@ -2308,21 +2308,21 @@
+
+ /* synchronize cpus_allowed to cpu_active_mask */
+ if (cpus_updated) {
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ if (!on_dfl)
+ cpumask_copy(top_cpuset.cpus_allowed, &new_cpus);
+ cpumask_copy(top_cpuset.effective_cpus, &new_cpus);
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+ /* we don't mess with cpumasks of tasks in top_cpuset */
+ }
+
+ /* synchronize mems_allowed to N_MEMORY */
+ if (mems_updated) {
+- spin_lock_irq(&callback_lock);
++ raw_spin_lock_irq(&callback_lock);
+ if (!on_dfl)
+ top_cpuset.mems_allowed = new_mems;
+ top_cpuset.effective_mems = new_mems;
+- spin_unlock_irq(&callback_lock);
++ raw_spin_unlock_irq(&callback_lock);
+ update_tasks_nodemask(&top_cpuset);
+ }
+
+@@ -2420,11 +2420,11 @@
+ {
+ unsigned long flags;
+
+- spin_lock_irqsave(&callback_lock, flags);
++ raw_spin_lock_irqsave(&callback_lock, flags);
+ rcu_read_lock();
+ guarantee_online_cpus(task_cs(tsk), pmask);
+ rcu_read_unlock();
+- spin_unlock_irqrestore(&callback_lock, flags);
++ raw_spin_unlock_irqrestore(&callback_lock, flags);
+ }
+
+ void cpuset_cpus_allowed_fallback(struct task_struct *tsk)
+@@ -2472,11 +2472,11 @@
+ nodemask_t mask;
+ unsigned long flags;
+
+- spin_lock_irqsave(&callback_lock, flags);
++ raw_spin_lock_irqsave(&callback_lock, flags);
+ rcu_read_lock();
+ guarantee_online_mems(task_cs(tsk), &mask);
+ rcu_read_unlock();
+- spin_unlock_irqrestore(&callback_lock, flags);
++ raw_spin_unlock_irqrestore(&callback_lock, flags);
+
+ return mask;
+ }
+@@ -2568,14 +2568,14 @@
+ return true;
+
+ /* Not hardwall and node outside mems_allowed: scan up cpusets */
+- spin_lock_irqsave(&callback_lock, flags);
++ raw_spin_lock_irqsave(&callback_lock, flags);
+
+ rcu_read_lock();
+ cs = nearest_hardwall_ancestor(task_cs(current));
+ allowed = node_isset(node, cs->mems_allowed);
+ rcu_read_unlock();
+
+- spin_unlock_irqrestore(&callback_lock, flags);
++ raw_spin_unlock_irqrestore(&callback_lock, flags);
+ return allowed;
+ }
+
+diff -Nur linux-4.9.22.orig/kernel/debug/kdb/kdb_io.c linux-4.9.22/kernel/debug/kdb/kdb_io.c
+--- linux-4.9.22.orig/kernel/debug/kdb/kdb_io.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/debug/kdb/kdb_io.c 2017-04-18 17:19:16.682773230 +0200
@@ -554,7 +554,6 @@
int linecount;
int colcount;
@@ -10834,9 +11275,9 @@ diff -Nur linux-4.9.6.orig/kernel/debug/kdb/kdb_io.c linux-4.9.6/kernel/debug/kd
return r;
}
-diff -Nur linux-4.9.6.orig/kernel/events/core.c linux-4.9.6/kernel/events/core.c
---- linux-4.9.6.orig/kernel/events/core.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/events/core.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/events/core.c linux-4.9.22/kernel/events/core.c
+--- linux-4.9.22.orig/kernel/events/core.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/events/core.c 2017-04-18 17:19:16.686773386 +0200
@@ -1050,6 +1050,7 @@
raw_spin_lock_init(&cpuctx->hrtimer_lock);
hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED);
@@ -10845,7 +11286,7 @@ diff -Nur linux-4.9.6.orig/kernel/events/core.c linux-4.9.6/kernel/events/core.c
}
static int perf_mux_hrtimer_restart(struct perf_cpu_context *cpuctx)
-@@ -8335,6 +8336,7 @@
+@@ -8363,6 +8364,7 @@
hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
hwc->hrtimer.function = perf_swevent_hrtimer;
@@ -10853,9 +11294,9 @@ diff -Nur linux-4.9.6.orig/kernel/events/core.c linux-4.9.6/kernel/events/core.c
/*
* Since hrtimers have a fixed rate, we can do a static freq->period
-diff -Nur linux-4.9.6.orig/kernel/exit.c linux-4.9.6/kernel/exit.c
---- linux-4.9.6.orig/kernel/exit.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/exit.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/exit.c linux-4.9.22/kernel/exit.c
+--- linux-4.9.22.orig/kernel/exit.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/exit.c 2017-04-18 17:19:16.686773386 +0200
@@ -143,7 +143,7 @@
* Do this under ->siglock, we can race with another thread
* doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals.
@@ -10865,9 +11306,9 @@ diff -Nur linux-4.9.6.orig/kernel/exit.c linux-4.9.6/kernel/exit.c
tsk->sighand = NULL;
spin_unlock(&sighand->siglock);
-diff -Nur linux-4.9.6.orig/kernel/fork.c linux-4.9.6/kernel/fork.c
---- linux-4.9.6.orig/kernel/fork.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/fork.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/fork.c linux-4.9.22/kernel/fork.c
+--- linux-4.9.22.orig/kernel/fork.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/fork.c 2017-04-18 17:19:16.686773386 +0200
@@ -76,6 +76,7 @@
#include <linux/compiler.h>
#include <linux/sysctl.h>
@@ -10959,10 +11400,40 @@ diff -Nur linux-4.9.6.orig/kernel/fork.c linux-4.9.6/kernel/fork.c
p->utime = p->stime = p->gtime = 0;
p->utimescaled = p->stimescaled = 0;
-diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
---- linux-4.9.6.orig/kernel/futex.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/futex.c 2017-01-28 13:59:09.955657109 +0100
-@@ -904,7 +904,9 @@
+diff -Nur linux-4.9.22.orig/kernel/futex.c linux-4.9.22/kernel/futex.c
+--- linux-4.9.22.orig/kernel/futex.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/futex.c 2017-04-18 17:19:16.686773386 +0200
+@@ -800,7 +800,7 @@
+ return 0;
+ }
+
+-static struct futex_pi_state * alloc_pi_state(void)
++static struct futex_pi_state *alloc_pi_state(void)
+ {
+ struct futex_pi_state *pi_state = current->pi_state_cache;
+
+@@ -810,6 +810,11 @@
+ return pi_state;
+ }
+
++static void get_pi_state(struct futex_pi_state *pi_state)
++{
++ WARN_ON_ONCE(!atomic_inc_not_zero(&pi_state->refcount));
++}
++
+ /*
+ * Drops a reference to the pi_state object and frees or caches it
+ * when the last reference is gone.
+@@ -854,7 +859,7 @@
+ * Look up the task based on what TID userspace gave us.
+ * We dont trust it.
+ */
+-static struct task_struct * futex_find_get_task(pid_t pid)
++static struct task_struct *futex_find_get_task(pid_t pid)
+ {
+ struct task_struct *p;
+
+@@ -904,7 +909,9 @@
* task still owns the PI-state:
*/
if (head->next != next) {
@@ -10972,36 +11443,388 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
continue;
}
-@@ -1299,6 +1301,7 @@
- struct futex_pi_state *pi_state = this->pi_state;
+@@ -914,10 +921,12 @@
+ pi_state->owner = NULL;
+ raw_spin_unlock_irq(&curr->pi_lock);
+
+- rt_mutex_unlock(&pi_state->pi_mutex);
+-
++ get_pi_state(pi_state);
+ spin_unlock(&hb->lock);
+
++ rt_mutex_futex_unlock(&pi_state->pi_mutex);
++ put_pi_state(pi_state);
++
+ raw_spin_lock_irq(&curr->pi_lock);
+ }
+ raw_spin_unlock_irq(&curr->pi_lock);
+@@ -971,6 +980,39 @@
+ *
+ * [10] There is no transient state which leaves owner and user space
+ * TID out of sync.
++ *
++ *
++ * Serialization and lifetime rules:
++ *
++ * hb->lock:
++ *
++ * hb -> futex_q, relation
++ * futex_q -> pi_state, relation
++ *
++ * (cannot be raw because hb can contain arbitrary amount
++ * of futex_q's)
++ *
++ * pi_mutex->wait_lock:
++ *
++ * {uval, pi_state}
++ *
++ * (and pi_mutex 'obviously')
++ *
++ * p->pi_lock:
++ *
++ * p->pi_state_list -> pi_state->list, relation
++ *
++ * pi_state->refcount:
++ *
++ * pi_state lifetime
++ *
++ *
++ * Lock order:
++ *
++ * hb->lock
++ * pi_mutex->wait_lock
++ * p->pi_lock
++ *
+ */
+
+ /*
+@@ -978,10 +1020,12 @@
+ * the pi_state against the user space value. If correct, attach to
+ * it.
+ */
+-static int attach_to_pi_state(u32 uval, struct futex_pi_state *pi_state,
++static int attach_to_pi_state(u32 __user *uaddr, u32 uval,
++ struct futex_pi_state *pi_state,
+ struct futex_pi_state **ps)
+ {
+ pid_t pid = uval & FUTEX_TID_MASK;
++ int ret, uval2;
+
+ /*
+ * Userspace might have messed up non-PI and PI futexes [3]
+@@ -989,9 +1033,39 @@
+ if (unlikely(!pi_state))
+ return -EINVAL;
+
++ /*
++ * We get here with hb->lock held, and having found a
++ * futex_top_waiter(). This means that futex_lock_pi() of said futex_q
++ * has dropped the hb->lock in between queue_me() and unqueue_me_pi(),
++ * which in turn means that futex_lock_pi() still has a reference on
++ * our pi_state.
++ *
++ * The waiter holding a reference on @pi_state also protects against
++ * the unlocked put_pi_state() in futex_unlock_pi(), futex_lock_pi()
++ * and futex_wait_requeue_pi() as it cannot go to 0 and consequently
++ * free pi_state before we can take a reference ourselves.
++ */
+ WARN_ON(!atomic_read(&pi_state->refcount));
+
+ /*
++ * Now that we have a pi_state, we can acquire wait_lock
++ * and do the state validation.
++ */
++ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
++
++ /*
++ * Since {uval, pi_state} is serialized by wait_lock, and our current
++ * uval was read without holding it, it can have changed. Verify it
++ * still is what we expect it to be, otherwise retry the entire
++ * operation.
++ */
++ if (get_futex_value_locked(&uval2, uaddr))
++ goto out_efault;
++
++ if (uval != uval2)
++ goto out_eagain;
++
++ /*
+ * Handle the owner died case:
+ */
+ if (uval & FUTEX_OWNER_DIED) {
+@@ -1006,11 +1080,11 @@
+ * is not 0. Inconsistent state. [5]
+ */
+ if (pid)
+- return -EINVAL;
++ goto out_einval;
+ /*
+ * Take a ref on the state and return success. [4]
+ */
+- goto out_state;
++ goto out_attach;
+ }
+
+ /*
+@@ -1022,14 +1096,14 @@
+ * Take a ref on the state and return success. [6]
+ */
+ if (!pid)
+- goto out_state;
++ goto out_attach;
+ } else {
+ /*
+ * If the owner died bit is not set, then the pi_state
+ * must have an owner. [7]
+ */
+ if (!pi_state->owner)
+- return -EINVAL;
++ goto out_einval;
+ }
+
+ /*
+@@ -1038,11 +1112,29 @@
+ * user space TID. [9/10]
+ */
+ if (pid != task_pid_vnr(pi_state->owner))
+- return -EINVAL;
+-out_state:
+- atomic_inc(&pi_state->refcount);
++ goto out_einval;
++
++out_attach:
++ get_pi_state(pi_state);
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+ *ps = pi_state;
+ return 0;
++
++out_einval:
++ ret = -EINVAL;
++ goto out_error;
++
++out_eagain:
++ ret = -EAGAIN;
++ goto out_error;
++
++out_efault:
++ ret = -EFAULT;
++ goto out_error;
++
++out_error:
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
++ return ret;
+ }
+
+ /*
+@@ -1093,6 +1185,9 @@
+
+ /*
+ * No existing pi state. First waiter. [2]
++ *
++ * This creates pi_state, we have hb->lock held, this means nothing can
++ * observe this state, wait_lock is irrelevant.
+ */
+ pi_state = alloc_pi_state();
+
+@@ -1117,17 +1212,18 @@
+ return 0;
+ }
+
+-static int lookup_pi_state(u32 uval, struct futex_hash_bucket *hb,
++static int lookup_pi_state(u32 __user *uaddr, u32 uval,
++ struct futex_hash_bucket *hb,
+ union futex_key *key, struct futex_pi_state **ps)
+ {
+- struct futex_q *match = futex_top_waiter(hb, key);
++ struct futex_q *top_waiter = futex_top_waiter(hb, key);
+
+ /*
+ * If there is a waiter on that futex, validate it and
+ * attach to the pi_state when the validation succeeds.
+ */
+- if (match)
+- return attach_to_pi_state(uval, match->pi_state, ps);
++ if (top_waiter)
++ return attach_to_pi_state(uaddr, uval, top_waiter->pi_state, ps);
+
+ /*
+ * We are the first waiter - try to look up the owner based on
+@@ -1146,7 +1242,7 @@
+ if (unlikely(cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)))
+ return -EFAULT;
+
+- /*If user space value changed, let the caller retry */
++ /* If user space value changed, let the caller retry */
+ return curval != uval ? -EAGAIN : 0;
+ }
+
+@@ -1174,7 +1270,7 @@
+ struct task_struct *task, int set_waiters)
+ {
+ u32 uval, newval, vpid = task_pid_vnr(task);
+- struct futex_q *match;
++ struct futex_q *top_waiter;
+ int ret;
+
+ /*
+@@ -1200,9 +1296,9 @@
+ * Lookup existing state first. If it exists, try to attach to
+ * its pi_state.
+ */
+- match = futex_top_waiter(hb, key);
+- if (match)
+- return attach_to_pi_state(uval, match->pi_state, ps);
++ top_waiter = futex_top_waiter(hb, key);
++ if (top_waiter)
++ return attach_to_pi_state(uaddr, uval, top_waiter->pi_state, ps);
+
+ /*
+ * No waiter and user TID is 0. We are here because the
+@@ -1288,45 +1384,39 @@
+ * memory barrier is required here to prevent the following
+ * store to lock_ptr from getting ahead of the plist_del.
+ */
+- smp_wmb();
+- q->lock_ptr = NULL;
++ smp_store_release(&q->lock_ptr, NULL);
+ }
+
+-static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this,
+- struct futex_hash_bucket *hb)
++/*
++ * Caller must hold a reference on @pi_state.
++ */
++static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_state)
+ {
+- struct task_struct *new_owner;
+- struct futex_pi_state *pi_state = this->pi_state;
u32 uninitialized_var(curval), newval;
++ struct task_struct *new_owner;
++ bool deboost = false;
WAKE_Q(wake_q);
+- bool deboost;
+ WAKE_Q(wake_sleeper_q);
- bool deboost;
int ret = 0;
-@@ -1365,7 +1368,8 @@
+- if (!pi_state)
+- return -EINVAL;
+-
+- /*
+- * If current does not own the pi_state then the futex is
+- * inconsistent and user space fiddled with the futex value.
+- */
+- if (pi_state->owner != current)
+- return -EINVAL;
+-
+- raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+ new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
++ if (WARN_ON_ONCE(!new_owner)) {
++ /*
++ * As per the comment in futex_unlock_pi() this should not happen.
++ *
++ * When this happens, give up our locks and try again, giving
++ * the futex_lock_pi() instance time to complete, either by
++ * waiting on the rtmutex or removing itself from the futex
++ * queue.
++ */
++ ret = -EAGAIN;
++ goto out_unlock;
++ }
+
+ /*
+- * It is possible that the next waiter (the one that brought
+- * this owner to the kernel) timed out and is no longer
+- * waiting on the lock.
+- */
+- if (!new_owner)
+- new_owner = this->task;
+-
+- /*
+- * We pass it to the next owner. The WAITERS bit is always
+- * kept enabled while there is PI state around. We cleanup the
+- * owner died bit, because we are the owner.
++ * We pass it to the next owner. The WAITERS bit is always kept
++ * enabled while there is PI state around. We cleanup the owner
++ * died bit, because we are the owner.
+ */
+ newval = FUTEX_WAITERS | task_pid_vnr(new_owner);
- raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+@@ -1335,6 +1425,7 @@
-- deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
-+ deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q,
-+ &wake_sleeper_q);
+ if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) {
+ ret = -EFAULT;
++
+ } else if (curval != uval) {
+ /*
+ * If a unconditional UNLOCK_PI operation (user space did not
+@@ -1347,10 +1438,9 @@
+ else
+ ret = -EINVAL;
+ }
+- if (ret) {
+- raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+- return ret;
+- }
++
++ if (ret)
++ goto out_unlock;
+ raw_spin_lock(&pi_state->owner->pi_lock);
+ WARN_ON(list_empty(&pi_state->list));
+@@ -1363,22 +1453,22 @@
+ pi_state->owner = new_owner;
+ raw_spin_unlock(&new_owner->pi_lock);
+
+- raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+-
+- deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
+-
/*
- * First unlock HB so the waiter does not spin on it once he got woken
-@@ -1373,8 +1377,9 @@
- * deboost first (and lose our higher priority), then the task might get
- * scheduled away before the wake up can take place.
+- * First unlock HB so the waiter does not spin on it once he got woken
+- * up. Second wake up the waiter before the priority is adjusted. If we
+- * deboost first (and lose our higher priority), then the task might get
+- * scheduled away before the wake up can take place.
++ * We've updated the uservalue, this unlock cannot fail.
*/
- spin_unlock(&hb->lock);
-+ deboost |= spin_unlock_no_deboost(&hb->lock);
- wake_up_q(&wake_q);
-+ wake_up_q_sleeper(&wake_sleeper_q);
- if (deboost)
+- wake_up_q(&wake_q);
+- if (deboost)
++ deboost = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q,
++ &wake_sleeper_q);
++
++out_unlock:
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
++
++ if (deboost) {
++ wake_up_q(&wake_q);
++ wake_up_q_sleeper(&wake_sleeper_q);
rt_mutex_adjust_prio(current);
++ }
+
+- return 0;
++ return ret;
+ }
-@@ -1924,6 +1929,16 @@
+ /*
+@@ -1824,7 +1914,7 @@
+ * If that call succeeds then we have pi_state and an
+ * initial refcount on it.
+ */
+- ret = lookup_pi_state(ret, hb2, &key2, &pi_state);
++ ret = lookup_pi_state(uaddr2, ret, hb2, &key2, &pi_state);
+ }
+
+ switch (ret) {
+@@ -1907,7 +1997,7 @@
+ * refcount on the pi_state and store the pointer in
+ * the futex_q object of the waiter.
+ */
+- atomic_inc(&pi_state->refcount);
++ get_pi_state(pi_state);
+ this->pi_state = pi_state;
+ ret = rt_mutex_start_proxy_lock(&pi_state->pi_mutex,
+ this->rt_waiter,
+@@ -1924,6 +2014,16 @@
requeue_pi_wake_futex(this, &key2, hb2);
drop_count++;
continue;
@@ -11018,16 +11841,471 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
} else if (ret) {
/*
* rt_mutex_start_proxy_lock() detected a
-@@ -2814,7 +2829,7 @@
+@@ -2007,20 +2107,7 @@
+ hb_waiters_dec(hb);
+ }
+
+-/**
+- * queue_me() - Enqueue the futex_q on the futex_hash_bucket
+- * @q: The futex_q to enqueue
+- * @hb: The destination hash bucket
+- *
+- * The hb->lock must be held by the caller, and is released here. A call to
+- * queue_me() is typically paired with exactly one call to unqueue_me(). The
+- * exceptions involve the PI related operations, which may use unqueue_me_pi()
+- * or nothing if the unqueue is done as part of the wake process and the unqueue
+- * state is implicit in the state of woken task (see futex_wait_requeue_pi() for
+- * an example).
+- */
+-static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
+- __releases(&hb->lock)
++static inline void __queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
+ {
+ int prio;
+
+@@ -2037,6 +2124,24 @@
+ plist_node_init(&q->list, prio);
+ plist_add(&q->list, &hb->chain);
+ q->task = current;
++}
++
++/**
++ * queue_me() - Enqueue the futex_q on the futex_hash_bucket
++ * @q: The futex_q to enqueue
++ * @hb: The destination hash bucket
++ *
++ * The hb->lock must be held by the caller, and is released here. A call to
++ * queue_me() is typically paired with exactly one call to unqueue_me(). The
++ * exceptions involve the PI related operations, which may use unqueue_me_pi()
++ * or nothing if the unqueue is done as part of the wake process and the unqueue
++ * state is implicit in the state of woken task (see futex_wait_requeue_pi() for
++ * an example).
++ */
++static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
++ __releases(&hb->lock)
++{
++ __queue_me(q, hb);
+ spin_unlock(&hb->lock);
+ }
+
+@@ -2123,10 +2228,13 @@
+ {
+ u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS;
+ struct futex_pi_state *pi_state = q->pi_state;
+- struct task_struct *oldowner = pi_state->owner;
+ u32 uval, uninitialized_var(curval), newval;
++ struct task_struct *oldowner;
+ int ret;
+
++ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
++
++ oldowner = pi_state->owner;
+ /* Owner died? */
+ if (!pi_state->owner)
+ newtid |= FUTEX_OWNER_DIED;
+@@ -2134,7 +2242,8 @@
+ /*
+ * We are here either because we stole the rtmutex from the
+ * previous highest priority waiter or we are the highest priority
+- * waiter but failed to get the rtmutex the first time.
++ * waiter but have failed to get the rtmutex the first time.
++ *
+ * We have to replace the newowner TID in the user space variable.
+ * This must be atomic as we have to preserve the owner died bit here.
+ *
+@@ -2142,17 +2251,16 @@
+ * because we can fault here. Imagine swapped out pages or a fork
+ * that marked all the anonymous memory readonly for cow.
+ *
+- * Modifying pi_state _before_ the user space value would
+- * leave the pi_state in an inconsistent state when we fault
+- * here, because we need to drop the hash bucket lock to
+- * handle the fault. This might be observed in the PID check
+- * in lookup_pi_state.
++ * Modifying pi_state _before_ the user space value would leave the
++ * pi_state in an inconsistent state when we fault here, because we
++ * need to drop the locks to handle the fault. This might be observed
++ * in the PID check in lookup_pi_state.
+ */
+ retry:
+ if (get_futex_value_locked(&uval, uaddr))
+ goto handle_fault;
+
+- while (1) {
++ for (;;) {
+ newval = (uval & FUTEX_OWNER_DIED) | newtid;
+
+ if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval))
+@@ -2167,47 +2275,60 @@
+ * itself.
+ */
+ if (pi_state->owner != NULL) {
+- raw_spin_lock_irq(&pi_state->owner->pi_lock);
++ raw_spin_lock(&pi_state->owner->pi_lock);
+ WARN_ON(list_empty(&pi_state->list));
+ list_del_init(&pi_state->list);
+- raw_spin_unlock_irq(&pi_state->owner->pi_lock);
++ raw_spin_unlock(&pi_state->owner->pi_lock);
+ }
+
+ pi_state->owner = newowner;
+
+- raw_spin_lock_irq(&newowner->pi_lock);
++ raw_spin_lock(&newowner->pi_lock);
+ WARN_ON(!list_empty(&pi_state->list));
+ list_add(&pi_state->list, &newowner->pi_state_list);
+- raw_spin_unlock_irq(&newowner->pi_lock);
++ raw_spin_unlock(&newowner->pi_lock);
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
++
+ return 0;
+
+ /*
+- * To handle the page fault we need to drop the hash bucket
+- * lock here. That gives the other task (either the highest priority
+- * waiter itself or the task which stole the rtmutex) the
+- * chance to try the fixup of the pi_state. So once we are
+- * back from handling the fault we need to check the pi_state
+- * after reacquiring the hash bucket lock and before trying to
+- * do another fixup. When the fixup has been done already we
+- * simply return.
++ * To handle the page fault we need to drop the locks here. That gives
++ * the other task (either the highest priority waiter itself or the
++ * task which stole the rtmutex) the chance to try the fixup of the
++ * pi_state. So once we are back from handling the fault we need to
++ * check the pi_state after reacquiring the locks and before trying to
++ * do another fixup. When the fixup has been done already we simply
++ * return.
++ *
++ * Note: we hold both hb->lock and pi_mutex->wait_lock. We can safely
++ * drop hb->lock since the caller owns the hb -> futex_q relation.
++ * Dropping the pi_mutex->wait_lock requires the state revalidate.
+ */
+ handle_fault:
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+ spin_unlock(q->lock_ptr);
+
+ ret = fault_in_user_writeable(uaddr);
+
+ spin_lock(q->lock_ptr);
++ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+
+ /*
+ * Check if someone else fixed it for us:
+ */
+- if (pi_state->owner != oldowner)
+- return 0;
++ if (pi_state->owner != oldowner) {
++ ret = 0;
++ goto out_unlock;
++ }
+
+ if (ret)
+- return ret;
++ goto out_unlock;
+
+ goto retry;
++
++out_unlock:
++ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
++ return ret;
+ }
+
+ static long futex_wait_restart(struct restart_block *restart);
+@@ -2229,13 +2350,16 @@
+ */
+ static int fixup_owner(u32 __user *uaddr, struct futex_q *q, int locked)
+ {
+- struct task_struct *owner;
+ int ret = 0;
+
+ if (locked) {
+ /*
+ * Got the lock. We might not be the anticipated owner if we
+ * did a lock-steal - fix up the PI-state in that case:
++ *
++ * We can safely read pi_state->owner without holding wait_lock
++ * because we now own the rt_mutex, only the owner will attempt
++ * to change it.
+ */
+ if (q->pi_state->owner != current)
+ ret = fixup_pi_state_owner(uaddr, q, current);
+@@ -2243,43 +2367,15 @@
+ }
+
+ /*
+- * Catch the rare case, where the lock was released when we were on the
+- * way back before we locked the hash bucket.
+- */
+- if (q->pi_state->owner == current) {
+- /*
+- * Try to get the rt_mutex now. This might fail as some other
+- * task acquired the rt_mutex after we removed ourself from the
+- * rt_mutex waiters list.
+- */
+- if (rt_mutex_trylock(&q->pi_state->pi_mutex)) {
+- locked = 1;
+- goto out;
+- }
+-
+- /*
+- * pi_state is incorrect, some other task did a lock steal and
+- * we returned due to timeout or signal without taking the
+- * rt_mutex. Too late.
+- */
+- raw_spin_lock_irq(&q->pi_state->pi_mutex.wait_lock);
+- owner = rt_mutex_owner(&q->pi_state->pi_mutex);
+- if (!owner)
+- owner = rt_mutex_next_owner(&q->pi_state->pi_mutex);
+- raw_spin_unlock_irq(&q->pi_state->pi_mutex.wait_lock);
+- ret = fixup_pi_state_owner(uaddr, q, owner);
+- goto out;
+- }
+-
+- /*
+ * Paranoia check. If we did not take the lock, then we should not be
+ * the owner of the rt_mutex.
+ */
+- if (rt_mutex_owner(&q->pi_state->pi_mutex) == current)
++ if (rt_mutex_owner(&q->pi_state->pi_mutex) == current) {
+ printk(KERN_ERR "fixup_owner: ret = %d pi-mutex: %p "
+ "pi-state %p\n", ret,
+ q->pi_state->pi_mutex.owner,
+ q->pi_state->owner);
++ }
+
+ out:
+ return ret ? ret : locked;
+@@ -2503,6 +2599,8 @@
+ ktime_t *time, int trylock)
+ {
struct hrtimer_sleeper timeout, *to = NULL;
++ struct futex_pi_state *pi_state = NULL;
++ struct rt_mutex_waiter rt_waiter;
+ struct futex_hash_bucket *hb;
+ struct futex_q q = futex_q_init;
+ int res, ret;
+@@ -2555,25 +2653,77 @@
+ }
+ }
+
++ WARN_ON(!q.pi_state);
++
+ /*
+ * Only actually queue now that the atomic ops are done:
+ */
+- queue_me(&q, hb);
++ __queue_me(&q, hb);
+
+- WARN_ON(!q.pi_state);
+- /*
+- * Block on the PI mutex:
+- */
+- if (!trylock) {
+- ret = rt_mutex_timed_futex_lock(&q.pi_state->pi_mutex, to);
+- } else {
+- ret = rt_mutex_trylock(&q.pi_state->pi_mutex);
++ if (trylock) {
++ ret = rt_mutex_futex_trylock(&q.pi_state->pi_mutex);
+ /* Fixup the trylock return value: */
+ ret = ret ? 0 : -EWOULDBLOCK;
++ goto no_block;
++ }
++
++ rt_mutex_init_waiter(&rt_waiter, false);
++
++ /*
++ * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not
++ * hold it while doing rt_mutex_start_proxy(), because then it will
++ * include hb->lock in the blocking chain, even through we'll not in
++ * fact hold it while blocking. This will lead it to report -EDEADLK
++ * and BUG when futex_unlock_pi() interleaves with this.
++ *
++ * Therefore acquire wait_lock while holding hb->lock, but drop the
++ * latter before calling rt_mutex_start_proxy_lock(). This still fully
++ * serializes against futex_unlock_pi() as that does the exact same
++ * lock handoff sequence.
++ */
++ raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock);
++ /*
++ * the migrate_disable() here disables migration in the in_atomic() fast
++ * path which is enabled again in the following spin_unlock(). We have
++ * one migrate_disable() pending in the slow-path which is reversed
++ * after the raw_spin_unlock_irq() where we leave the atomic context.
++ */
++ migrate_disable();
++
++ spin_unlock(q.lock_ptr);
++ ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current);
++ raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock);
++ migrate_enable();
++
++ if (ret) {
++ if (ret == 1)
++ ret = 0;
++
++ spin_lock(q.lock_ptr);
++ goto no_block;
+ }
+
++
++ if (unlikely(to))
++ hrtimer_start_expires(&to->timer, HRTIMER_MODE_ABS);
++
++ ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter);
++
+ spin_lock(q.lock_ptr);
+ /*
++ * If we failed to acquire the lock (signal/timeout), we must
++ * first acquire the hb->lock before removing the lock from the
++ * rt_mutex waitqueue, such that we can keep the hb and rt_mutex
++ * wait lists consistent.
++ *
++ * In particular; it is important that futex_unlock_pi() can not
++ * observe this inconsistency.
++ */
++ if (ret && !rt_mutex_cleanup_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter))
++ ret = 0;
++
++no_block:
++ /*
+ * Fixup the pi_state owner and possibly acquire the lock if we
+ * haven't already.
+ */
+@@ -2589,12 +2739,19 @@
+ * If fixup_owner() faulted and was unable to handle the fault, unlock
+ * it and return the fault to userspace.
+ */
+- if (ret && (rt_mutex_owner(&q.pi_state->pi_mutex) == current))
+- rt_mutex_unlock(&q.pi_state->pi_mutex);
++ if (ret && (rt_mutex_owner(&q.pi_state->pi_mutex) == current)) {
++ pi_state = q.pi_state;
++ get_pi_state(pi_state);
++ }
+
+ /* Unqueue and drop the lock */
+ unqueue_me_pi(&q);
+
++ if (pi_state) {
++ rt_mutex_futex_unlock(&pi_state->pi_mutex);
++ put_pi_state(pi_state);
++ }
++
+ goto out_put_key;
+
+ out_unlock_put_key:
+@@ -2631,7 +2788,7 @@
+ u32 uninitialized_var(curval), uval, vpid = task_pid_vnr(current);
+ union futex_key key = FUTEX_KEY_INIT;
+ struct futex_hash_bucket *hb;
+- struct futex_q *match;
++ struct futex_q *top_waiter;
+ int ret;
+
+ retry:
+@@ -2655,12 +2812,48 @@
+ * all and we at least want to know if user space fiddled
+ * with the futex value instead of blindly unlocking.
+ */
+- match = futex_top_waiter(hb, &key);
+- if (match) {
+- ret = wake_futex_pi(uaddr, uval, match, hb);
++ top_waiter = futex_top_waiter(hb, &key);
++ if (top_waiter) {
++ struct futex_pi_state *pi_state = top_waiter->pi_state;
++
++ ret = -EINVAL;
++ if (!pi_state)
++ goto out_unlock;
++
+ /*
+- * In case of success wake_futex_pi dropped the hash
+- * bucket lock.
++ * If current does not own the pi_state then the futex is
++ * inconsistent and user space fiddled with the futex value.
++ */
++ if (pi_state->owner != current)
++ goto out_unlock;
++
++ get_pi_state(pi_state);
++ /*
++ * By taking wait_lock while still holding hb->lock, we ensure
++ * there is no point where we hold neither; and therefore
++ * wake_futex_pi() must observe a state consistent with what we
++ * observed.
++ */
++ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
++ /*
++ * Magic trickery for now to make the RT migrate disable
++ * logic happy. The following spin_unlock() happens with
++ * interrupts disabled so the internal migrate_enable()
++ * won't undo the migrate_disable() which was issued when
++ * locking hb->lock.
++ */
++ migrate_disable();
++ spin_unlock(&hb->lock);
++
++ /* Drops pi_state->pi_mutex.wait_lock */
++ ret = wake_futex_pi(uaddr, uval, pi_state);
++
++ migrate_enable();
++
++ put_pi_state(pi_state);
++
++ /*
++ * Success, we're done! No tricky corner cases.
+ */
+ if (!ret)
+ goto out_putkey;
+@@ -2675,7 +2868,6 @@
+ * setting the FUTEX_WAITERS bit. Try again.
+ */
+ if (ret == -EAGAIN) {
+- spin_unlock(&hb->lock);
+ put_futex_key(&key);
+ goto retry;
+ }
+@@ -2683,7 +2875,7 @@
+ * wake_futex_pi has detected invalid state. Tell user
+ * space.
+ */
+- goto out_unlock;
++ goto out_putkey;
+ }
+
+ /*
+@@ -2693,8 +2885,10 @@
+ * preserve the WAITERS bit not the OWNER_DIED one. We are the
+ * owner.
+ */
+- if (cmpxchg_futex_value_locked(&curval, uaddr, uval, 0))
++ if (cmpxchg_futex_value_locked(&curval, uaddr, uval, 0)) {
++ spin_unlock(&hb->lock);
+ goto pi_faulted;
++ }
+
+ /*
+ * If uval has changed, let user space handle it.
+@@ -2708,7 +2902,6 @@
+ return ret;
+
+ pi_faulted:
+- spin_unlock(&hb->lock);
+ put_futex_key(&key);
+
+ ret = fault_in_user_writeable(uaddr);
+@@ -2812,8 +3005,9 @@
+ u32 __user *uaddr2)
+ {
+ struct hrtimer_sleeper timeout, *to = NULL;
++ struct futex_pi_state *pi_state = NULL;
struct rt_mutex_waiter rt_waiter;
- struct rt_mutex *pi_mutex = NULL;
- struct futex_hash_bucket *hb;
+ struct futex_hash_bucket *hb, *hb2;
union futex_key key2 = FUTEX_KEY_INIT;
struct futex_q q = futex_q_init;
int res, ret;
-@@ -2839,10 +2854,7 @@
+@@ -2838,10 +3032,7 @@
* The waiter is allocated on our stack, manipulated by the requeue
* code while we sleep on uaddr.
*/
@@ -11039,7 +12317,7 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE);
if (unlikely(ret != 0))
-@@ -2873,20 +2885,55 @@
+@@ -2872,20 +3063,55 @@
/* Queue the futex_q, drop the hb lock, wait for wakeup. */
futex_wait_queue_me(hb, &q, to);
@@ -11106,7 +12384,7 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
/* Check if the requeue code acquired the second futex for us. */
if (!q.rt_waiter) {
-@@ -2895,14 +2942,15 @@
+@@ -2894,16 +3120,19 @@
* did a lock-steal - fix up the PI-state in that case.
*/
if (q.pi_state && (q.pi_state->owner != current)) {
@@ -11114,6 +12392,12 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
+ spin_lock(&hb2->lock);
+ BUG_ON(&hb2->lock != q.lock_ptr);
ret = fixup_pi_state_owner(uaddr2, &q, current);
+- if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current)
+- rt_mutex_unlock(&q.pi_state->pi_mutex);
++ if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) {
++ pi_state = q.pi_state;
++ get_pi_state(pi_state);
++ }
/*
* Drop the reference to the pi state which
* the requeue_pi() code acquired for us.
@@ -11123,20 +12407,51 @@ diff -Nur linux-4.9.6.orig/kernel/futex.c linux-4.9.6/kernel/futex.c
+ spin_unlock(&hb2->lock);
}
} else {
- /*
-@@ -2915,7 +2963,8 @@
- ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter);
- debug_rt_mutex_free_waiter(&rt_waiter);
+ struct rt_mutex *pi_mutex;
+@@ -2915,10 +3144,14 @@
+ */
+ WARN_ON(!q.pi_state);
+ pi_mutex = &q.pi_state->pi_mutex;
+- ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter);
+- debug_rt_mutex_free_waiter(&rt_waiter);
++ ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter);
- spin_lock(q.lock_ptr);
+ spin_lock(&hb2->lock);
+ BUG_ON(&hb2->lock != q.lock_ptr);
++ if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter))
++ ret = 0;
++
++ debug_rt_mutex_free_waiter(&rt_waiter);
/*
* Fixup the pi_state owner and possibly acquire the lock if we
* haven't already.
-diff -Nur linux-4.9.6.orig/kernel/irq/handle.c linux-4.9.6/kernel/irq/handle.c
---- linux-4.9.6.orig/kernel/irq/handle.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/irq/handle.c 2017-01-28 13:59:09.955657109 +0100
+@@ -2936,13 +3169,20 @@
+ * the fault, unlock the rt_mutex and return the fault to
+ * userspace.
+ */
+- if (ret && rt_mutex_owner(pi_mutex) == current)
+- rt_mutex_unlock(pi_mutex);
++ if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) {
++ pi_state = q.pi_state;
++ get_pi_state(pi_state);
++ }
+
+ /* Unqueue and drop the lock. */
+ unqueue_me_pi(&q);
+ }
+
++ if (pi_state) {
++ rt_mutex_futex_unlock(&pi_state->pi_mutex);
++ put_pi_state(pi_state);
++ }
++
+ if (ret == -EINTR) {
+ /*
+ * We've already been requeued, but cannot restart by calling
+diff -Nur linux-4.9.22.orig/kernel/irq/handle.c linux-4.9.22/kernel/irq/handle.c
+--- linux-4.9.22.orig/kernel/irq/handle.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/irq/handle.c 2017-04-18 17:19:16.686773386 +0200
@@ -181,10 +181,16 @@
{
irqreturn_t retval;
@@ -11155,9 +12470,9 @@ diff -Nur linux-4.9.6.orig/kernel/irq/handle.c linux-4.9.6/kernel/irq/handle.c
if (!noirqdebug)
note_interrupt(desc, retval);
-diff -Nur linux-4.9.6.orig/kernel/irq/manage.c linux-4.9.6/kernel/irq/manage.c
---- linux-4.9.6.orig/kernel/irq/manage.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/irq/manage.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/irq/manage.c linux-4.9.22/kernel/irq/manage.c
+--- linux-4.9.22.orig/kernel/irq/manage.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/irq/manage.c 2017-04-18 17:19:16.686773386 +0200
@@ -22,6 +22,7 @@
#include "internals.h"
@@ -11297,9 +12612,9 @@ diff -Nur linux-4.9.6.orig/kernel/irq/manage.c linux-4.9.6/kernel/irq/manage.c
* interrupt controller has per-cpu registers.
*/
int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
-diff -Nur linux-4.9.6.orig/kernel/irq/settings.h linux-4.9.6/kernel/irq/settings.h
---- linux-4.9.6.orig/kernel/irq/settings.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/irq/settings.h 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/irq/settings.h linux-4.9.22/kernel/irq/settings.h
+--- linux-4.9.22.orig/kernel/irq/settings.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/irq/settings.h 2017-04-18 17:19:16.686773386 +0200
@@ -16,6 +16,7 @@
_IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID,
_IRQ_IS_POLLED = IRQ_IS_POLLED,
@@ -11333,9 +12648,9 @@ diff -Nur linux-4.9.6.orig/kernel/irq/settings.h linux-4.9.6/kernel/irq/settings
static inline bool irq_settings_is_per_cpu(struct irq_desc *desc)
{
return desc->status_use_accessors & _IRQ_PER_CPU;
-diff -Nur linux-4.9.6.orig/kernel/irq/spurious.c linux-4.9.6/kernel/irq/spurious.c
---- linux-4.9.6.orig/kernel/irq/spurious.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/irq/spurious.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/irq/spurious.c linux-4.9.22/kernel/irq/spurious.c
+--- linux-4.9.22.orig/kernel/irq/spurious.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/irq/spurious.c 2017-04-18 17:19:16.686773386 +0200
@@ -442,6 +442,10 @@
static int __init irqfixup_setup(char *str)
@@ -11358,9 +12673,9 @@ diff -Nur linux-4.9.6.orig/kernel/irq/spurious.c linux-4.9.6/kernel/irq/spurious
irqfixup = 2;
printk(KERN_WARNING "Misrouted IRQ fixup and polling support "
"enabled\n");
-diff -Nur linux-4.9.6.orig/kernel/irq_work.c linux-4.9.6/kernel/irq_work.c
---- linux-4.9.6.orig/kernel/irq_work.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/irq_work.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/irq_work.c linux-4.9.22/kernel/irq_work.c
+--- linux-4.9.22.orig/kernel/irq_work.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/irq_work.c 2017-04-18 17:19:16.686773386 +0200
@@ -17,6 +17,7 @@
#include <linux/cpu.h>
#include <linux/notifier.h>
@@ -11482,9 +12797,9 @@ diff -Nur linux-4.9.6.orig/kernel/irq_work.c linux-4.9.6/kernel/irq_work.c
/*
* Synchronize against the irq_work @entry, ensures the entry is not
-diff -Nur linux-4.9.6.orig/kernel/Kconfig.locks linux-4.9.6/kernel/Kconfig.locks
---- linux-4.9.6.orig/kernel/Kconfig.locks 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/Kconfig.locks 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/kernel/Kconfig.locks linux-4.9.22/kernel/Kconfig.locks
+--- linux-4.9.22.orig/kernel/Kconfig.locks 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/Kconfig.locks 2017-04-18 17:19:16.682773230 +0200
@@ -225,11 +225,11 @@
config MUTEX_SPIN_ON_OWNER
@@ -11499,9 +12814,9 @@ diff -Nur linux-4.9.6.orig/kernel/Kconfig.locks linux-4.9.6/kernel/Kconfig.locks
config LOCK_SPIN_ON_OWNER
def_bool y
-diff -Nur linux-4.9.6.orig/kernel/Kconfig.preempt linux-4.9.6/kernel/Kconfig.preempt
---- linux-4.9.6.orig/kernel/Kconfig.preempt 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/Kconfig.preempt 2017-01-28 13:59:09.951656955 +0100
+diff -Nur linux-4.9.22.orig/kernel/Kconfig.preempt linux-4.9.22/kernel/Kconfig.preempt
+--- linux-4.9.22.orig/kernel/Kconfig.preempt 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/Kconfig.preempt 2017-04-18 17:19:16.682773230 +0200
@@ -1,3 +1,16 @@
+config PREEMPT
+ bool
@@ -11554,9 +12869,9 @@ diff -Nur linux-4.9.6.orig/kernel/Kconfig.preempt linux-4.9.6/kernel/Kconfig.pre
endchoice
config PREEMPT_COUNT
-diff -Nur linux-4.9.6.orig/kernel/ksysfs.c linux-4.9.6/kernel/ksysfs.c
---- linux-4.9.6.orig/kernel/ksysfs.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/ksysfs.c 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/ksysfs.c linux-4.9.22/kernel/ksysfs.c
+--- linux-4.9.22.orig/kernel/ksysfs.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/ksysfs.c 2017-04-18 17:19:16.686773386 +0200
@@ -136,6 +136,15 @@
#endif /* CONFIG_KEXEC_CORE */
@@ -11583,10 +12898,87 @@ diff -Nur linux-4.9.6.orig/kernel/ksysfs.c linux-4.9.6/kernel/ksysfs.c
NULL
};
-diff -Nur linux-4.9.6.orig/kernel/locking/lockdep.c linux-4.9.6/kernel/locking/lockdep.c
---- linux-4.9.6.orig/kernel/locking/lockdep.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/lockdep.c 2017-01-28 13:59:09.955657109 +0100
-@@ -3689,6 +3689,7 @@
+diff -Nur linux-4.9.22.orig/kernel/locking/lockdep.c linux-4.9.22/kernel/locking/lockdep.c
+--- linux-4.9.22.orig/kernel/locking/lockdep.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/lockdep.c 2017-04-18 17:19:16.686773386 +0200
+@@ -658,6 +658,7 @@
+ struct lockdep_subclass_key *key;
+ struct hlist_head *hash_head;
+ struct lock_class *class;
++ bool is_static = false;
+
+ if (unlikely(subclass >= MAX_LOCKDEP_SUBCLASSES)) {
+ debug_locks_off();
+@@ -671,10 +672,23 @@
+
+ /*
+ * Static locks do not have their class-keys yet - for them the key
+- * is the lock object itself:
+- */
+- if (unlikely(!lock->key))
+- lock->key = (void *)lock;
++ * is the lock object itself. If the lock is in the per cpu area,
++ * the canonical address of the lock (per cpu offset removed) is
++ * used.
++ */
++ if (unlikely(!lock->key)) {
++ unsigned long can_addr, addr = (unsigned long)lock;
++
++ if (__is_kernel_percpu_address(addr, &can_addr))
++ lock->key = (void *)can_addr;
++ else if (__is_module_percpu_address(addr, &can_addr))
++ lock->key = (void *)can_addr;
++ else if (static_obj(lock))
++ lock->key = (void *)lock;
++ else
++ return ERR_PTR(-EINVAL);
++ is_static = true;
++ }
+
+ /*
+ * NOTE: the class-key must be unique. For dynamic locks, a static
+@@ -706,7 +720,7 @@
+ }
+ }
+
+- return NULL;
++ return is_static || static_obj(lock->key) ? NULL : ERR_PTR(-EINVAL);
+ }
+
+ /*
+@@ -724,19 +738,18 @@
+ DEBUG_LOCKS_WARN_ON(!irqs_disabled());
+
+ class = look_up_lock_class(lock, subclass);
+- if (likely(class))
++ if (likely(!IS_ERR_OR_NULL(class)))
+ goto out_set_class_cache;
+
+ /*
+ * Debug-check: all keys must be persistent!
+- */
+- if (!static_obj(lock->key)) {
++ */
++ if (IS_ERR(class)) {
+ debug_locks_off();
+ printk("INFO: trying to register non-static key.\n");
+ printk("the code is fine but needs lockdep annotation.\n");
+ printk("turning off the locking correctness validator.\n");
+ dump_stack();
+-
+ return NULL;
+ }
+
+@@ -3410,7 +3423,7 @@
+ * Clearly if the lock hasn't been acquired _ever_, we're not
+ * holding it either, so report failure.
+ */
+- if (!class)
++ if (IS_ERR_OR_NULL(class))
+ return 0;
+
+ /*
+@@ -3689,6 +3702,7 @@
}
}
@@ -11594,7 +12986,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/lockdep.c linux-4.9.6/kernel/locking/l
/*
* We dont accurately track softirq state in e.g.
* hardirq contexts (such as on 4KSTACKS), so only
-@@ -3703,6 +3704,7 @@
+@@ -3703,6 +3717,7 @@
DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled);
}
}
@@ -11602,9 +12994,18 @@ diff -Nur linux-4.9.6.orig/kernel/locking/lockdep.c linux-4.9.6/kernel/locking/l
if (!debug_locks)
print_irqtrace_events(current);
-diff -Nur linux-4.9.6.orig/kernel/locking/locktorture.c linux-4.9.6/kernel/locking/locktorture.c
---- linux-4.9.6.orig/kernel/locking/locktorture.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/locktorture.c 2017-01-28 13:59:09.959657263 +0100
+@@ -4159,7 +4174,7 @@
+ * If the class exists we look it up and zap it:
+ */
+ class = look_up_lock_class(lock, j);
+- if (class)
++ if (!IS_ERR_OR_NULL(class))
+ zap_class(class);
+ }
+ /*
+diff -Nur linux-4.9.22.orig/kernel/locking/locktorture.c linux-4.9.22/kernel/locking/locktorture.c
+--- linux-4.9.22.orig/kernel/locking/locktorture.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/locktorture.c 2017-04-18 17:19:16.686773386 +0200
@@ -26,7 +26,6 @@
#include <linux/kthread.h>
#include <linux/sched/rt.h>
@@ -11613,9 +13014,9 @@ diff -Nur linux-4.9.6.orig/kernel/locking/locktorture.c linux-4.9.6/kernel/locki
#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <linux/smp.h>
-diff -Nur linux-4.9.6.orig/kernel/locking/Makefile linux-4.9.6/kernel/locking/Makefile
---- linux-4.9.6.orig/kernel/locking/Makefile 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/Makefile 2017-01-28 13:59:09.955657109 +0100
+diff -Nur linux-4.9.22.orig/kernel/locking/Makefile linux-4.9.22/kernel/locking/Makefile
+--- linux-4.9.22.orig/kernel/locking/Makefile 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/Makefile 2017-04-18 17:19:16.686773386 +0200
@@ -2,7 +2,7 @@
# and is generally not a function of system call inputs.
KCOV_INSTRUMENT := n
@@ -11632,8 +13033,8 @@ diff -Nur linux-4.9.6.orig/kernel/locking/Makefile linux-4.9.6/kernel/locking/Ma
+ifneq ($(CONFIG_PREEMPT_RT_FULL),y)
+obj-y += mutex.o
obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o
-+obj-y += rwsem.o
+endif
++obj-y += rwsem.o
obj-$(CONFIG_LOCKDEP) += lockdep.o
ifeq ($(CONFIG_PROC_FS),y)
obj-$(CONFIG_LOCKDEP) += lockdep_proc.o
@@ -11645,12 +13046,12 @@ diff -Nur linux-4.9.6.orig/kernel/locking/Makefile linux-4.9.6/kernel/locking/Ma
obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o
+endif
-+obj-$(CONFIG_PREEMPT_RT_FULL) += rt.o
++obj-$(CONFIG_PREEMPT_RT_FULL) += rt.o rwsem-rt.o
obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o
obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o
-diff -Nur linux-4.9.6.orig/kernel/locking/percpu-rwsem.c linux-4.9.6/kernel/locking/percpu-rwsem.c
---- linux-4.9.6.orig/kernel/locking/percpu-rwsem.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/percpu-rwsem.c 2017-01-28 13:59:09.959657263 +0100
+diff -Nur linux-4.9.22.orig/kernel/locking/percpu-rwsem.c linux-4.9.22/kernel/locking/percpu-rwsem.c
+--- linux-4.9.22.orig/kernel/locking/percpu-rwsem.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/percpu-rwsem.c 2017-04-18 17:19:16.686773386 +0200
@@ -18,7 +18,7 @@
/* ->rw_sem represents the whole percpu_rw_semaphore for lockdep */
rcu_sync_init(&sem->rss, RCU_SCHED_SYNC);
@@ -11678,10 +13079,10 @@ diff -Nur linux-4.9.6.orig/kernel/locking/percpu-rwsem.c linux-4.9.6/kernel/lock
}
EXPORT_SYMBOL_GPL(percpu_down_write);
-diff -Nur linux-4.9.6.orig/kernel/locking/rt.c linux-4.9.6/kernel/locking/rt.c
---- linux-4.9.6.orig/kernel/locking/rt.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/kernel/locking/rt.c 2017-01-28 13:59:10.035660185 +0100
-@@ -0,0 +1,498 @@
+diff -Nur linux-4.9.22.orig/kernel/locking/rt.c linux-4.9.22/kernel/locking/rt.c
+--- linux-4.9.22.orig/kernel/locking/rt.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/kernel/locking/rt.c 2017-04-18 17:19:16.690773540 +0200
+@@ -0,0 +1,331 @@
+/*
+ * kernel/rt.c
+ *
@@ -11990,173 +13391,6 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rt.c linux-4.9.6/kernel/locking/rt.c
+}
+EXPORT_SYMBOL(__rt_rwlock_init);
+
-+/*
-+ * rw_semaphores
-+ */
-+
-+void rt_up_write(struct rw_semaphore *rwsem)
-+{
-+ rwsem_release(&rwsem->dep_map, 1, _RET_IP_);
-+ rt_mutex_unlock(&rwsem->lock);
-+}
-+EXPORT_SYMBOL(rt_up_write);
-+
-+void __rt_up_read(struct rw_semaphore *rwsem)
-+{
-+ if (--rwsem->read_depth == 0)
-+ rt_mutex_unlock(&rwsem->lock);
-+}
-+
-+void rt_up_read(struct rw_semaphore *rwsem)
-+{
-+ rwsem_release(&rwsem->dep_map, 1, _RET_IP_);
-+ __rt_up_read(rwsem);
-+}
-+EXPORT_SYMBOL(rt_up_read);
-+
-+/*
-+ * downgrade a write lock into a read lock
-+ * - just wake up any readers at the front of the queue
-+ */
-+void rt_downgrade_write(struct rw_semaphore *rwsem)
-+{
-+ BUG_ON(rt_mutex_owner(&rwsem->lock) != current);
-+ rwsem->read_depth = 1;
-+}
-+EXPORT_SYMBOL(rt_downgrade_write);
-+
-+int rt_down_write_trylock(struct rw_semaphore *rwsem)
-+{
-+ int ret = rt_mutex_trylock(&rwsem->lock);
-+
-+ if (ret)
-+ rwsem_acquire(&rwsem->dep_map, 0, 1, _RET_IP_);
-+ return ret;
-+}
-+EXPORT_SYMBOL(rt_down_write_trylock);
-+
-+void rt_down_write(struct rw_semaphore *rwsem)
-+{
-+ rwsem_acquire(&rwsem->dep_map, 0, 0, _RET_IP_);
-+ rt_mutex_lock(&rwsem->lock);
-+}
-+EXPORT_SYMBOL(rt_down_write);
-+
-+int rt_down_write_killable(struct rw_semaphore *rwsem)
-+{
-+ int ret;
-+
-+ rwsem_acquire(&rwsem->dep_map, 0, 0, _RET_IP_);
-+ ret = rt_mutex_lock_killable(&rwsem->lock);
-+ if (ret)
-+ rwsem_release(&rwsem->dep_map, 1, _RET_IP_);
-+ return ret;
-+}
-+EXPORT_SYMBOL(rt_down_write_killable);
-+
-+int rt_down_write_killable_nested(struct rw_semaphore *rwsem, int subclass)
-+{
-+ int ret;
-+
-+ rwsem_acquire(&rwsem->dep_map, subclass, 0, _RET_IP_);
-+ ret = rt_mutex_lock_killable(&rwsem->lock);
-+ if (ret)
-+ rwsem_release(&rwsem->dep_map, 1, _RET_IP_);
-+ return ret;
-+}
-+EXPORT_SYMBOL(rt_down_write_killable_nested);
-+
-+void rt_down_write_nested(struct rw_semaphore *rwsem, int subclass)
-+{
-+ rwsem_acquire(&rwsem->dep_map, subclass, 0, _RET_IP_);
-+ rt_mutex_lock(&rwsem->lock);
-+}
-+EXPORT_SYMBOL(rt_down_write_nested);
-+
-+void rt_down_write_nested_lock(struct rw_semaphore *rwsem,
-+ struct lockdep_map *nest)
-+{
-+ rwsem_acquire_nest(&rwsem->dep_map, 0, 0, nest, _RET_IP_);
-+ rt_mutex_lock(&rwsem->lock);
-+}
-+EXPORT_SYMBOL(rt_down_write_nested_lock);
-+
-+int rt__down_read_trylock(struct rw_semaphore *rwsem)
-+{
-+ struct rt_mutex *lock = &rwsem->lock;
-+ int ret = 1;
-+
-+ /*
-+ * recursive read locks succeed when current owns the rwsem,
-+ * but not when read_depth == 0 which means that the rwsem is
-+ * write locked.
-+ */
-+ if (rt_mutex_owner(lock) != current)
-+ ret = rt_mutex_trylock(&rwsem->lock);
-+ else if (!rwsem->read_depth)
-+ ret = 0;
-+
-+ if (ret)
-+ rwsem->read_depth++;
-+ return ret;
-+
-+}
-+
-+int rt_down_read_trylock(struct rw_semaphore *rwsem)
-+{
-+ int ret;
-+
-+ ret = rt__down_read_trylock(rwsem);
-+ if (ret)
-+ rwsem_acquire(&rwsem->dep_map, 0, 1, _RET_IP_);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL(rt_down_read_trylock);
-+
-+void rt__down_read(struct rw_semaphore *rwsem)
-+{
-+ struct rt_mutex *lock = &rwsem->lock;
-+
-+ if (rt_mutex_owner(lock) != current)
-+ rt_mutex_lock(&rwsem->lock);
-+ rwsem->read_depth++;
-+}
-+EXPORT_SYMBOL(rt__down_read);
-+
-+static void __rt_down_read(struct rw_semaphore *rwsem, int subclass)
-+{
-+ rwsem_acquire_read(&rwsem->dep_map, subclass, 0, _RET_IP_);
-+ rt__down_read(rwsem);
-+}
-+
-+void rt_down_read(struct rw_semaphore *rwsem)
-+{
-+ __rt_down_read(rwsem, 0);
-+}
-+EXPORT_SYMBOL(rt_down_read);
-+
-+void rt_down_read_nested(struct rw_semaphore *rwsem, int subclass)
-+{
-+ __rt_down_read(rwsem, subclass);
-+}
-+EXPORT_SYMBOL(rt_down_read_nested);
-+
-+void __rt_rwsem_init(struct rw_semaphore *rwsem, const char *name,
-+ struct lock_class_key *key)
-+{
-+#ifdef CONFIG_DEBUG_LOCK_ALLOC
-+ /*
-+ * Make sure we are not reinitializing a held lock:
-+ */
-+ debug_check_no_locks_freed((void *)rwsem, sizeof(*rwsem));
-+ lockdep_init_map(&rwsem->dep_map, name, key, 0);
-+#endif
-+ rwsem->read_depth = 0;
-+ rwsem->lock.save_state = 0;
-+}
-+EXPORT_SYMBOL(__rt_rwsem_init);
-+
+/**
+ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0
+ * @cnt: the atomic which we are to dec
@@ -12180,9 +13414,9 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rt.c linux-4.9.6/kernel/locking/rt.c
+ return 1;
+}
+EXPORT_SYMBOL(atomic_dec_and_mutex_lock);
-diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/rtmutex.c
---- linux-4.9.6.orig/kernel/locking/rtmutex.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/rtmutex.c 2017-01-28 13:59:10.035660185 +0100
+diff -Nur linux-4.9.22.orig/kernel/locking/rtmutex.c linux-4.9.22/kernel/locking/rtmutex.c
+--- linux-4.9.22.orig/kernel/locking/rtmutex.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/rtmutex.c 2017-04-18 17:19:16.690773540 +0200
@@ -7,6 +7,11 @@
* Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com>
* Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt
@@ -12337,10 +13571,14 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
/*
* The current top waiter stays enqueued. We
* don't have to change anything in the lock
-@@ -941,6 +983,433 @@
- return 1;
- }
+@@ -936,10 +978,394 @@
+ */
+ rt_mutex_set_owner(lock, task);
+- rt_mutex_deadlock_account_lock(lock, task);
++ return 1;
++}
++
+#ifdef CONFIG_PREEMPT_RT_FULL
+/*
+ * preemptible spin_lock functions:
@@ -12356,19 +13594,18 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ migrate_disable();
+
+ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
-+ rt_mutex_deadlock_account_lock(lock, current);
++ return;
+ else
+ slowfn(lock, do_mig_dis);
+}
+
-+static inline int rt_spin_lock_fastunlock(struct rt_mutex *lock,
-+ int (*slowfn)(struct rt_mutex *lock))
++static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock,
++ void (*slowfn)(struct rt_mutex *lock))
+{
-+ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
-+ rt_mutex_deadlock_account_unlock(current);
-+ return 0;
-+ }
-+ return slowfn(lock);
++ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
++ return;
++ else
++ slowfn(lock);
+}
+#ifdef CONFIG_SMP
+/*
@@ -12379,7 +13616,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ struct task_struct *owner)
+{
+ int res = 0;
-+
+
+ rcu_read_lock();
+ for (;;) {
+ if (owner != rt_mutex_owner(lock))
@@ -12402,8 +13639,8 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+static int adaptive_wait(struct rt_mutex *lock,
+ struct task_struct *orig_owner)
+{
-+ return 1;
-+}
+ return 1;
+ }
+#endif
+
+static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
@@ -12509,7 +13746,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+/*
+ * Slow path to release a rt_mutex spin_lock style
+ */
-+static int noinline __sched rt_spin_lock_slowunlock(struct rt_mutex *lock)
++static void noinline __sched rt_spin_lock_slowunlock(struct rt_mutex *lock)
+{
+ unsigned long flags;
+ WAKE_Q(wake_q);
@@ -12519,12 +13756,10 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+
+ debug_rt_mutex_unlock(lock);
+
-+ rt_mutex_deadlock_account_unlock(current);
-+
+ if (!rt_mutex_has_waiters(lock)) {
+ lock->owner = NULL;
+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-+ return 0;
++ return;
+ }
+
+ mark_wakeup_next_waiter(&wake_q, &wake_sleeper_q, lock);
@@ -12535,33 +13770,6 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+
+ /* Undo pi boosting.when necessary */
+ rt_mutex_adjust_prio(current);
-+ return 0;
-+}
-+
-+static int noinline __sched rt_spin_lock_slowunlock_no_deboost(struct rt_mutex *lock)
-+{
-+ unsigned long flags;
-+ WAKE_Q(wake_q);
-+ WAKE_Q(wake_sleeper_q);
-+
-+ raw_spin_lock_irqsave(&lock->wait_lock, flags);
-+
-+ debug_rt_mutex_unlock(lock);
-+
-+ rt_mutex_deadlock_account_unlock(current);
-+
-+ if (!rt_mutex_has_waiters(lock)) {
-+ lock->owner = NULL;
-+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-+ return 0;
-+ }
-+
-+ mark_wakeup_next_waiter(&wake_q, &wake_sleeper_q, lock);
-+
-+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-+ wake_up_q(&wake_q);
-+ wake_up_q_sleeper(&wake_sleeper_q);
-+ return 1;
+}
+
+void __lockfunc rt_spin_lock__no_mg(spinlock_t *lock)
@@ -12616,17 +13824,6 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+}
+EXPORT_SYMBOL(rt_spin_unlock);
+
-+int __lockfunc rt_spin_unlock_no_deboost(spinlock_t *lock)
-+{
-+ int ret;
-+
-+ /* NOTE: we always pass in '1' for nested, for simplicity */
-+ spin_release(&lock->dep_map, 1, _RET_IP_);
-+ ret = rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock_no_deboost);
-+ migrate_enable();
-+ return ret;
-+}
-+
+void __lockfunc __rt_spin_unlock(struct rt_mutex *lock)
+{
+ rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock);
@@ -12767,11 +13964,10 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+{
+ return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL);
+}
-+
+
/*
* Task blocks on lock.
- *
-@@ -971,6 +1440,23 @@
+@@ -971,6 +1397,23 @@
return -EDEADLK;
raw_spin_lock(&task->pi_lock);
@@ -12795,7 +13991,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
__rt_mutex_adjust_prio(task);
waiter->task = task;
waiter->lock = lock;
-@@ -994,7 +1480,7 @@
+@@ -994,7 +1437,7 @@
rt_mutex_enqueue_pi(owner, waiter);
__rt_mutex_adjust_prio(owner);
@@ -12804,7 +14000,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
chain_walk = 1;
} else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) {
chain_walk = 1;
-@@ -1036,6 +1522,7 @@
+@@ -1036,6 +1479,7 @@
* Called with lock->wait_lock held and interrupts disabled.
*/
static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
@@ -12812,7 +14008,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
struct rt_mutex *lock)
{
struct rt_mutex_waiter *waiter;
-@@ -1064,7 +1551,10 @@
+@@ -1064,7 +1508,10 @@
raw_spin_unlock(&current->pi_lock);
@@ -12824,7 +14020,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
}
/*
-@@ -1078,7 +1568,7 @@
+@@ -1078,7 +1525,7 @@
{
bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
struct task_struct *owner = rt_mutex_owner(lock);
@@ -12833,7 +14029,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
raw_spin_lock(&current->pi_lock);
rt_mutex_dequeue(lock, waiter);
-@@ -1102,7 +1592,8 @@
+@@ -1102,7 +1549,8 @@
__rt_mutex_adjust_prio(owner);
/* Store the lock on which owner is blocked or NULL */
@@ -12843,7 +14039,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
raw_spin_unlock(&owner->pi_lock);
-@@ -1138,17 +1629,17 @@
+@@ -1138,21 +1586,30 @@
raw_spin_lock_irqsave(&task->pi_lock, flags);
waiter = task->pi_blocked_on;
@@ -12863,7 +14059,20 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL,
next_lock, NULL, task);
}
-@@ -1166,7 +1657,8 @@
+
++void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate)
++{
++ debug_rt_mutex_init_waiter(waiter);
++ RB_CLEAR_NODE(&waiter->pi_tree_entry);
++ RB_CLEAR_NODE(&waiter->tree_entry);
++ waiter->task = NULL;
++ waiter->savestate = savestate;
++}
++
+ /**
+ * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop
+ * @lock: the rt_mutex to take
+@@ -1166,7 +1623,8 @@
static int __sched
__rt_mutex_slowlock(struct rt_mutex *lock, int state,
struct hrtimer_sleeper *timeout,
@@ -12873,26 +14082,51 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
{
int ret = 0;
-@@ -1189,6 +1681,12 @@
- break;
- }
+@@ -1175,16 +1633,17 @@
+ if (try_to_take_rt_mutex(lock, current, waiter))
+ break;
-+ if (ww_ctx && ww_ctx->acquired > 0) {
-+ ret = __mutex_lock_check_stamp(lock, ww_ctx);
-+ if (ret)
-+ break;
+- /*
+- * TASK_INTERRUPTIBLE checks for signals and
+- * timeout. Ignored otherwise.
+- */
+- if (unlikely(state == TASK_INTERRUPTIBLE)) {
+- /* Signal pending? */
+- if (signal_pending(current))
+- ret = -EINTR;
+- if (timeout && !timeout->task)
+- ret = -ETIMEDOUT;
++ if (timeout && !timeout->task) {
++ ret = -ETIMEDOUT;
++ break;
++ }
++ if (signal_pending_state(state, current)) {
++ ret = -EINTR;
++ break;
+ }
+
- raw_spin_unlock_irq(&lock->wait_lock);
-
- debug_rt_mutex_print_deadlock(waiter);
-@@ -1223,21 +1721,96 @@
++ if (ww_ctx && ww_ctx->acquired > 0) {
++ ret = __mutex_lock_check_stamp(lock, ww_ctx);
+ if (ret)
+ break;
+ }
+@@ -1223,35 +1682,94 @@
}
}
+-/*
+- * Slow path lock function:
+- */
+-static int __sched
+-rt_mutex_slowlock(struct rt_mutex *lock, int state,
+- struct hrtimer_sleeper *timeout,
+- enum rtmutex_chainwalk chwalk)
+static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww,
+ struct ww_acquire_ctx *ww_ctx)
-+{
+ {
+- struct rt_mutex_waiter waiter;
+- unsigned long flags;
+- int ret = 0;
+#ifdef CONFIG_DEBUG_MUTEXES
+ /*
+ * If this WARN_ON triggers, you used ww_mutex_lock to acquire,
@@ -12901,7 +14135,10 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ * This should never happen, always use ww_mutex_unlock.
+ */
+ DEBUG_LOCKS_WARN_ON(ww->ctx);
-+
+
+- debug_rt_mutex_init_waiter(&waiter);
+- RB_CLEAR_NODE(&waiter.pi_tree_entry);
+- RB_CLEAR_NODE(&waiter.tree_entry);
+ /*
+ * Not quite done after calling ww_acquire_done() ?
+ */
@@ -12921,10 +14158,17 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0);
+ ww_ctx->contending_lock = NULL;
+ }
-+
-+ /*
+
+ /*
+- * Technically we could use raw_spin_[un]lock_irq() here, but this can
+- * be called in early boot if the cmpxchg() fast path is disabled
+- * (debug, no architecture support). In this case we will acquire the
+- * rtmutex with lock->wait_lock held. But we cannot unconditionally
+- * enable interrupts in that early boot case. So we need to use the
+- * irqsave/restore variants.
+ * Naughty, using a different class will lead to undefined behavior!
-+ */
+ */
+- raw_spin_lock_irqsave(&lock->wait_lock, flags);
+ DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class);
+#endif
+ ww_ctx->acquired++;
@@ -12966,44 +14210,36 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+}
+#endif
+
- /*
- * Slow path lock function:
- */
- static int __sched
- rt_mutex_slowlock(struct rt_mutex *lock, int state,
- struct hrtimer_sleeper *timeout,
-- enum rtmutex_chainwalk chwalk)
-+ enum rtmutex_chainwalk chwalk,
-+ struct ww_acquire_ctx *ww_ctx)
- {
- struct rt_mutex_waiter waiter;
- unsigned long flags;
- int ret = 0;
-
-- debug_rt_mutex_init_waiter(&waiter);
-- RB_CLEAR_NODE(&waiter.pi_tree_entry);
-- RB_CLEAR_NODE(&waiter.tree_entry);
-+ rt_mutex_init_waiter(&waiter, false);
-
- /*
- * Technically we could use raw_spin_[un]lock_irq() here, but this can
-@@ -1251,6 +1824,8 @@
++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state,
++ struct hrtimer_sleeper *timeout,
++ enum rtmutex_chainwalk chwalk,
++ struct ww_acquire_ctx *ww_ctx,
++ struct rt_mutex_waiter *waiter)
++{
++ int ret;
/* Try to acquire the lock again: */
if (try_to_take_rt_mutex(lock, current, NULL)) {
+- raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
+ if (ww_ctx)
+ ww_mutex_account_lock(lock, ww_ctx);
- raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
return 0;
}
-@@ -1265,13 +1840,23 @@
- if (likely(!ret))
+@@ -1261,17 +1779,27 @@
+ if (unlikely(timeout))
+ hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS);
+
+- ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk);
++ ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk);
+
+- if (likely(!ret))
++ if (likely(!ret)) {
/* sleep on the mutex */
- ret = __rt_mutex_slowlock(lock, state, timeout, &waiter);
-+ ret = __rt_mutex_slowlock(lock, state, timeout, &waiter,
++ ret = __rt_mutex_slowlock(lock, state, timeout, waiter,
+ ww_ctx);
-+ else if (ww_ctx) {
++ } else if (ww_ctx) {
+ /* ww_mutex received EDEADLK, let it become EALREADY */
+ ret = __mutex_lock_check_stamp(lock, ww_ctx);
+ BUG_ON(!ret);
@@ -13012,17 +14248,55 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
if (unlikely(ret)) {
__set_current_state(TASK_RUNNING);
if (rt_mutex_has_waiters(lock))
- remove_waiter(lock, &waiter);
+- remove_waiter(lock, &waiter);
- rt_mutex_handle_deadlock(ret, chwalk, &waiter);
++ remove_waiter(lock, waiter);
+ /* ww_mutex want to report EDEADLK/EALREADY, let them */
+ if (!ww_ctx)
-+ rt_mutex_handle_deadlock(ret, chwalk, &waiter);
++ rt_mutex_handle_deadlock(ret, chwalk, waiter);
+ } else if (ww_ctx) {
+ ww_mutex_account_lock(lock, ww_ctx);
}
/*
-@@ -1331,7 +1916,8 @@
+@@ -1279,6 +1807,36 @@
+ * unconditionally. We might have to fix that up.
+ */
+ fixup_rt_mutex_waiters(lock);
++ return ret;
++}
++
++/*
++ * Slow path lock function:
++ */
++static int __sched
++rt_mutex_slowlock(struct rt_mutex *lock, int state,
++ struct hrtimer_sleeper *timeout,
++ enum rtmutex_chainwalk chwalk,
++ struct ww_acquire_ctx *ww_ctx)
++{
++ struct rt_mutex_waiter waiter;
++ unsigned long flags;
++ int ret = 0;
++
++ rt_mutex_init_waiter(&waiter, false);
++
++ /*
++ * Technically we could use raw_spin_[un]lock_irq() here, but this can
++ * be called in early boot if the cmpxchg() fast path is disabled
++ * (debug, no architecture support). In this case we will acquire the
++ * rtmutex with lock->wait_lock held. But we cannot unconditionally
++ * enable interrupts in that early boot case. So we need to use the
++ * irqsave/restore variants.
++ */
++ raw_spin_lock_irqsave(&lock->wait_lock, flags);
++
++ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx,
++ &waiter);
+
+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
+
+@@ -1331,7 +1889,8 @@
* Return whether the current task needs to undo a potential priority boosting.
*/
static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
@@ -13032,7 +14306,16 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
{
unsigned long flags;
-@@ -1387,7 +1973,7 @@
+@@ -1340,8 +1899,6 @@
+
+ debug_rt_mutex_unlock(lock);
+
+- rt_mutex_deadlock_account_unlock(current);
+-
+ /*
+ * We must be careful here if the fast path is enabled. If we
+ * have no waiters queued we cannot set owner to NULL here
+@@ -1387,7 +1944,7 @@
*
* Queue the next waiter for wakeup once we release the wait_lock.
*/
@@ -13041,7 +14324,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-@@ -1403,31 +1989,36 @@
+@@ -1403,63 +1960,79 @@
*/
static inline int
rt_mutex_fastlock(struct rt_mutex *lock, int state,
@@ -13052,13 +14335,14 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ enum rtmutex_chainwalk chwalk,
+ struct ww_acquire_ctx *ww_ctx))
{
- if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) {
- rt_mutex_deadlock_account_lock(lock, current);
+- if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) {
+- rt_mutex_deadlock_account_lock(lock, current);
++ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
return 0;
- } else
+- } else
- return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK);
-+ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK,
-+ ww_ctx);
++
++ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx);
}
static inline int
@@ -13073,16 +14357,29 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ struct ww_acquire_ctx *ww_ctx))
{
if (chwalk == RT_MUTEX_MIN_CHAINWALK &&
- likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) {
- rt_mutex_deadlock_account_lock(lock, current);
+- likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) {
+- rt_mutex_deadlock_account_lock(lock, current);
++ likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
return 0;
- } else
+- } else
- return slowfn(lock, state, timeout, chwalk);
-+ return slowfn(lock, state, timeout, chwalk, ww_ctx);
++
++ return slowfn(lock, state, timeout, chwalk, ww_ctx);
}
static inline int
-@@ -1444,17 +2035,20 @@
+ rt_mutex_fasttrylock(struct rt_mutex *lock,
+ int (*slowfn)(struct rt_mutex *lock))
+ {
+- if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) {
+- rt_mutex_deadlock_account_lock(lock, current);
++ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
+ return 1;
+- }
++
+ return slowfn(lock);
+ }
+
static inline void
rt_mutex_fastunlock(struct rt_mutex *lock,
bool (*slowfn)(struct rt_mutex *lock,
@@ -13092,47 +14389,76 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
{
WAKE_Q(wake_q);
+ WAKE_Q(wake_sleeper_q);
++ bool deboost;
- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
- rt_mutex_deadlock_account_unlock(current);
+- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
+- rt_mutex_deadlock_account_unlock(current);
++ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
++ return;
- } else {
+- } else {
- bool deboost = slowfn(lock, &wake_q);
-+ bool deboost = slowfn(lock, &wake_q, &wake_sleeper_q);
++ deboost = slowfn(lock, &wake_q, &wake_sleeper_q);
- wake_up_q(&wake_q);
-+ wake_up_q_sleeper(&wake_sleeper_q);
+- wake_up_q(&wake_q);
++ wake_up_q(&wake_q);
++ wake_up_q_sleeper(&wake_sleeper_q);
- /* Undo pi boosting if necessary: */
- if (deboost)
-@@ -1471,7 +2065,7 @@
- {
- might_sleep();
+- /* Undo pi boosting if necessary: */
+- if (deboost)
+- rt_mutex_adjust_prio(current);
+- }
++ /* Undo pi boosting if necessary: */
++ if (deboost)
++ rt_mutex_adjust_prio(current);
++}
++
++/**
++ * rt_mutex_lock_state - lock a rt_mutex with a given state
++ *
++ * @lock: The rt_mutex to be locked
++ * @state: The state to set when blocking on the rt_mutex
++ */
++int __sched rt_mutex_lock_state(struct rt_mutex *lock, int state)
++{
++ might_sleep();
++
++ return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock);
+ }
+ /**
+@@ -1469,15 +2042,13 @@
+ */
+ void __sched rt_mutex_lock(struct rt_mutex *lock)
+ {
+- might_sleep();
+-
- rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock);
-+ rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, NULL, rt_mutex_slowlock);
++ rt_mutex_lock_state(lock, TASK_UNINTERRUPTIBLE);
}
EXPORT_SYMBOL_GPL(rt_mutex_lock);
-@@ -1488,7 +2082,7 @@
+ /**
+ * rt_mutex_lock_interruptible - lock a rt_mutex interruptible
+- *
++ **
+ * @lock: the rt_mutex to be locked
+ *
+ * Returns:
+@@ -1486,23 +2057,32 @@
+ */
+ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock)
{
- might_sleep();
-
+- might_sleep();
+-
- return rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock);
-+ return rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, NULL, rt_mutex_slowlock);
++ return rt_mutex_lock_state(lock, TASK_INTERRUPTIBLE);
}
EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible);
-@@ -1501,11 +2095,30 @@
- might_sleep();
-
- return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
-- RT_MUTEX_FULL_CHAINWALK,
-+ RT_MUTEX_FULL_CHAINWALK, NULL,
- rt_mutex_slowlock);
- }
-
- /**
+-/*
+- * Futex variant with full deadlock detection.
++/**
+ * rt_mutex_lock_killable - lock a rt_mutex killable
+ *
+ * @lock: the rt_mutex to be locked
@@ -13141,21 +14467,29 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ * Returns:
+ * 0 on success
+ * -EINTR when interrupted by a signal
-+ * -EDEADLK when the lock would deadlock (when deadlock detection is on)
-+ */
+ */
+-int rt_mutex_timed_futex_lock(struct rt_mutex *lock,
+- struct hrtimer_sleeper *timeout)
+int __sched rt_mutex_lock_killable(struct rt_mutex *lock)
-+{
-+ might_sleep();
-+
-+ return rt_mutex_fastlock(lock, TASK_KILLABLE, NULL, rt_mutex_slowlock);
+ {
+- might_sleep();
++ return rt_mutex_lock_state(lock, TASK_KILLABLE);
+}
+EXPORT_SYMBOL_GPL(rt_mutex_lock_killable);
-+
-+/**
- * rt_mutex_timed_lock - lock a rt_mutex interruptible
- * the timeout structure is provided
- * by the caller
-@@ -1525,6 +2138,7 @@
+
+- return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
+- RT_MUTEX_FULL_CHAINWALK,
+- rt_mutex_slowlock);
++/*
++ * Futex variant, must not use fastpath.
++ */
++int __sched rt_mutex_futex_trylock(struct rt_mutex *lock)
++{
++ return rt_mutex_slowtrylock(lock);
+ }
+
+ /**
+@@ -1525,6 +2105,7 @@
return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
RT_MUTEX_MIN_CHAINWALK,
@@ -13163,7 +14497,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
rt_mutex_slowlock);
}
EXPORT_SYMBOL_GPL(rt_mutex_timed_lock);
-@@ -1542,7 +2156,11 @@
+@@ -1542,7 +2123,11 @@
*/
int __sched rt_mutex_trylock(struct rt_mutex *lock)
{
@@ -13175,24 +14509,60 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
return 0;
return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock);
-@@ -1568,13 +2186,14 @@
- * required or not.
+@@ -1561,20 +2146,41 @@
+ EXPORT_SYMBOL_GPL(rt_mutex_unlock);
+
+ /**
+- * rt_mutex_futex_unlock - Futex variant of rt_mutex_unlock
+- * @lock: the rt_mutex to be unlocked
+- *
+- * Returns: true/false indicating whether priority adjustment is
+- * required or not.
++ * Futex variant, that since futex variants do not use the fast-path, can be
++ * simple and will not need to retry.
*/
- bool __sched rt_mutex_futex_unlock(struct rt_mutex *lock,
+-bool __sched rt_mutex_futex_unlock(struct rt_mutex *lock,
- struct wake_q_head *wqh)
-+ struct wake_q_head *wqh,
-+ struct wake_q_head *wq_sleeper)
++bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock,
++ struct wake_q_head *wake_q,
++ struct wake_q_head *wq_sleeper)
++{
++ lockdep_assert_held(&lock->wait_lock);
++
++ debug_rt_mutex_unlock(lock);
++
++ if (!rt_mutex_has_waiters(lock)) {
++ lock->owner = NULL;
++ return false; /* done */
++ }
++
++ mark_wakeup_next_waiter(wake_q, wq_sleeper, lock);
++ return true; /* deboost and wakeups */
++}
++
++void __sched rt_mutex_futex_unlock(struct rt_mutex *lock)
{
- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
- rt_mutex_deadlock_account_unlock(current);
- return false;
+- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
+- rt_mutex_deadlock_account_unlock(current);
+- return false;
++ WAKE_Q(wake_q);
++ WAKE_Q(wake_sleeper_q);
++ bool deboost;
++
++ raw_spin_lock_irq(&lock->wait_lock);
++ deboost = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q);
++ raw_spin_unlock_irq(&lock->wait_lock);
++
++ if (deboost) {
++ wake_up_q(&wake_q);
++ wake_up_q_sleeper(&wake_sleeper_q);
++ rt_mutex_adjust_prio(current);
}
- return rt_mutex_slowunlock(lock, wqh);
-+ return rt_mutex_slowunlock(lock, wqh, wq_sleeper);
}
/**
-@@ -1607,13 +2226,12 @@
+@@ -1607,13 +2213,12 @@
void __rt_mutex_init(struct rt_mutex *lock, const char *name)
{
lock->owner = NULL;
@@ -13207,7 +14577,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
/**
* rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a
-@@ -1628,7 +2246,7 @@
+@@ -1628,10 +2233,9 @@
void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
struct task_struct *proxy_owner)
{
@@ -13215,11 +14585,42 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ rt_mutex_init(lock);
debug_rt_mutex_proxy_lock(lock, proxy_owner);
rt_mutex_set_owner(lock, proxy_owner);
- rt_mutex_deadlock_account_lock(lock, proxy_owner);
-@@ -1676,6 +2294,35 @@
- return 1;
- }
+- rt_mutex_deadlock_account_lock(lock, proxy_owner);
+ }
+
+ /**
+@@ -1647,34 +2251,45 @@
+ {
+ debug_rt_mutex_proxy_unlock(lock);
+ rt_mutex_set_owner(lock, NULL);
+- rt_mutex_deadlock_account_unlock(proxy_owner);
+ }
+
+-/**
+- * rt_mutex_start_proxy_lock() - Start lock acquisition for another task
+- * @lock: the rt_mutex to take
+- * @waiter: the pre-initialized rt_mutex_waiter
+- * @task: the task to prepare
+- *
+- * Returns:
+- * 0 - task blocked on lock
+- * 1 - acquired the lock for task, caller should wake it up
+- * <0 - error
+- *
+- * Special API call for FUTEX_REQUEUE_PI support.
+- */
+-int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
++int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
+ struct rt_mutex_waiter *waiter,
+ struct task_struct *task)
+ {
+ int ret;
+
+- raw_spin_lock_irq(&lock->wait_lock);
++ if (try_to_take_rt_mutex(lock, task, NULL))
++ return 1;
+- if (try_to_take_rt_mutex(lock, task, NULL)) {
+#ifdef CONFIG_PREEMPT_RT_FULL
+ /*
+ * In PREEMPT_RT there's an added race.
@@ -13242,17 +14643,17 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ raw_spin_lock(&task->pi_lock);
+ if (task->pi_blocked_on) {
+ raw_spin_unlock(&task->pi_lock);
-+ raw_spin_unlock_irq(&lock->wait_lock);
+ raw_spin_unlock_irq(&lock->wait_lock);
+- return 1;
+ return -EAGAIN;
-+ }
+ }
+ task->pi_blocked_on = PI_REQUEUE_INPROGRESS;
+ raw_spin_unlock(&task->pi_lock);
+#endif
-+
+
/* We enforce deadlock detection for futexes */
ret = task_blocks_on_rt_mutex(lock, waiter, task,
- RT_MUTEX_FULL_CHAINWALK);
-@@ -1690,7 +2337,7 @@
+@@ -1690,17 +2305,41 @@
ret = 0;
}
@@ -13260,20 +14661,127 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ if (ret && rt_mutex_has_waiters(lock))
remove_waiter(lock, waiter);
- raw_spin_unlock_irq(&lock->wait_lock);
-@@ -1746,7 +2393,7 @@
+- raw_spin_unlock_irq(&lock->wait_lock);
+-
+ debug_rt_mutex_print_deadlock(waiter);
+
+ return ret;
+ }
+
+ /**
++ * rt_mutex_start_proxy_lock() - Start lock acquisition for another task
++ * @lock: the rt_mutex to take
++ * @waiter: the pre-initialized rt_mutex_waiter
++ * @task: the task to prepare
++ *
++ * Returns:
++ * 0 - task blocked on lock
++ * 1 - acquired the lock for task, caller should wake it up
++ * <0 - error
++ *
++ * Special API call for FUTEX_REQUEUE_PI support.
++ */
++int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
++ struct rt_mutex_waiter *waiter,
++ struct task_struct *task)
++{
++ int ret;
++
++ raw_spin_lock_irq(&lock->wait_lock);
++ ret = __rt_mutex_start_proxy_lock(lock, waiter, task);
++ raw_spin_unlock_irq(&lock->wait_lock);
++
++ return ret;
++}
++
++/**
+ * rt_mutex_next_owner - return the next owner of the lock
+ *
+ * @lock: the rt lock query
+@@ -1721,21 +2360,23 @@
+ }
+
+ /**
+- * rt_mutex_finish_proxy_lock() - Complete lock acquisition
++ * rt_mutex_wait_proxy_lock() - Wait for lock acquisition
+ * @lock: the rt_mutex we were woken on
+ * @to: the timeout, null if none. hrtimer should already have
+ * been started.
+ * @waiter: the pre-initialized rt_mutex_waiter
+ *
+- * Complete the lock acquisition started our behalf by another thread.
++ * Wait for the the lock acquisition started on our behalf by
++ * rt_mutex_start_proxy_lock(). Upon failure, the caller must call
++ * rt_mutex_cleanup_proxy_lock().
+ *
+ * Returns:
+ * 0 - success
+ * <0 - error, one of -EINTR, -ETIMEDOUT
+ *
+- * Special API call for PI-futex requeue support
++ * Special API call for PI-futex support
+ */
+-int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
++int rt_mutex_wait_proxy_lock(struct rt_mutex *lock,
+ struct hrtimer_sleeper *to,
+ struct rt_mutex_waiter *waiter)
+ {
+@@ -1746,10 +2387,47 @@
set_current_state(TASK_INTERRUPTIBLE);
/* sleep on the mutex */
- ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter);
+ ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL);
- if (unlikely(ret))
+- if (unlikely(ret))
++ raw_spin_unlock_irq(&lock->wait_lock);
++
++ return ret;
++}
++
++/**
++ * rt_mutex_cleanup_proxy_lock() - Cleanup failed lock acquisition
++ * @lock: the rt_mutex we were woken on
++ * @waiter: the pre-initialized rt_mutex_waiter
++ *
++ * Attempt to clean up after a failed rt_mutex_wait_proxy_lock().
++ *
++ * Unless we acquired the lock; we're still enqueued on the wait-list and can
++ * in fact still be granted ownership until we're removed. Therefore we can
++ * find we are in fact the owner and must disregard the
++ * rt_mutex_wait_proxy_lock() failure.
++ *
++ * Returns:
++ * true - did the cleanup, we done.
++ * false - we acquired the lock after rt_mutex_wait_proxy_lock() returned,
++ * caller should disregards its return value.
++ *
++ * Special API call for PI-futex support
++ */
++bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock,
++ struct rt_mutex_waiter *waiter)
++{
++ bool cleanup = false;
++
++ raw_spin_lock_irq(&lock->wait_lock);
++ /*
++ * Unless we're the owner; we're still enqueued on the wait_list.
++ * So check if we became owner, if not, take us off the wait_list.
++ */
++ if (rt_mutex_owner(lock) != current) {
remove_waiter(lock, waiter);
-@@ -1761,3 +2408,89 @@
++ fixup_rt_mutex_waiters(lock);
++ cleanup = true;
++ }
- return ret;
- }
+ /*
+ * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might
+@@ -1759,5 +2437,91 @@
+
+ raw_spin_unlock_irq(&lock->wait_lock);
+
++ return cleanup;
++}
+
+static inline int
+ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
@@ -13316,8 +14824,8 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+ else if (!ret && ww_ctx->acquired > 1)
+ return ww_mutex_deadlock_injection(lock, ww_ctx);
+
-+ return ret;
-+}
+ return ret;
+ }
+EXPORT_SYMBOL_GPL(__ww_mutex_lock_interruptible);
+
+int __sched
@@ -13360,9 +14868,9 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex.c linux-4.9.6/kernel/locking/r
+}
+EXPORT_SYMBOL(ww_mutex_unlock);
+#endif
-diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex_common.h linux-4.9.6/kernel/locking/rtmutex_common.h
---- linux-4.9.6.orig/kernel/locking/rtmutex_common.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/rtmutex_common.h 2017-01-28 13:59:10.035660185 +0100
+diff -Nur linux-4.9.22.orig/kernel/locking/rtmutex_common.h linux-4.9.22/kernel/locking/rtmutex_common.h
+--- linux-4.9.22.orig/kernel/locking/rtmutex_common.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/rtmutex_common.h 2017-04-18 17:19:16.690773540 +0200
@@ -27,6 +27,7 @@
struct rb_node pi_tree_entry;
struct task_struct *task;
@@ -13371,7 +14879,7 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex_common.h linux-4.9.6/kernel/lo
#ifdef CONFIG_DEBUG_RT_MUTEXES
unsigned long ip;
struct pid *deadlock_task_pid;
-@@ -98,6 +99,9 @@
+@@ -98,22 +99,45 @@
/*
* PI-futex support (proxy locking functions, etc.):
*/
@@ -13381,34 +14889,364 @@ diff -Nur linux-4.9.6.orig/kernel/locking/rtmutex_common.h linux-4.9.6/kernel/lo
extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
struct task_struct *proxy_owner);
-@@ -111,7 +115,8 @@
- struct rt_mutex_waiter *waiter);
- extern int rt_mutex_timed_futex_lock(struct rt_mutex *l, struct hrtimer_sleeper *to);
- extern bool rt_mutex_futex_unlock(struct rt_mutex *lock,
+ extern void rt_mutex_proxy_unlock(struct rt_mutex *lock,
+ struct task_struct *proxy_owner);
++extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate);
++extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
++ struct rt_mutex_waiter *waiter,
++ struct task_struct *task);
+ extern int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
+ struct rt_mutex_waiter *waiter,
+ struct task_struct *task);
+-extern int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
+- struct hrtimer_sleeper *to,
+- struct rt_mutex_waiter *waiter);
+-extern int rt_mutex_timed_futex_lock(struct rt_mutex *l, struct hrtimer_sleeper *to);
+-extern bool rt_mutex_futex_unlock(struct rt_mutex *lock,
- struct wake_q_head *wqh);
-+ struct wake_q_head *wqh,
-+ struct wake_q_head *wq_sleeper);
++extern int rt_mutex_wait_proxy_lock(struct rt_mutex *lock,
++ struct hrtimer_sleeper *to,
++ struct rt_mutex_waiter *waiter);
++extern bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock,
++ struct rt_mutex_waiter *waiter);
++
++extern int rt_mutex_futex_trylock(struct rt_mutex *l);
++
++extern void rt_mutex_futex_unlock(struct rt_mutex *lock);
++extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock,
++ struct wake_q_head *wqh,
++ struct wake_q_head *wq_sleeper);
++
extern void rt_mutex_adjust_prio(struct task_struct *task);
++/* RW semaphore special interface */
++struct ww_acquire_ctx;
++
++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state,
++ struct hrtimer_sleeper *timeout,
++ enum rtmutex_chainwalk chwalk,
++ struct ww_acquire_ctx *ww_ctx,
++ struct rt_mutex_waiter *waiter);
++
#ifdef CONFIG_DEBUG_RT_MUTEXES
-@@ -120,4 +125,14 @@
- # include "rtmutex.h"
- #endif
+ # include "rtmutex-debug.h"
+ #else
+diff -Nur linux-4.9.22.orig/kernel/locking/rtmutex-debug.c linux-4.9.22/kernel/locking/rtmutex-debug.c
+--- linux-4.9.22.orig/kernel/locking/rtmutex-debug.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/rtmutex-debug.c 2017-04-18 17:19:16.690773540 +0200
+@@ -173,12 +173,3 @@
+ lock->name = name;
+ }
-+static inline void
-+rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate)
+-void
+-rt_mutex_deadlock_account_lock(struct rt_mutex *lock, struct task_struct *task)
+-{
+-}
+-
+-void rt_mutex_deadlock_account_unlock(struct task_struct *task)
+-{
+-}
+-
+diff -Nur linux-4.9.22.orig/kernel/locking/rtmutex-debug.h linux-4.9.22/kernel/locking/rtmutex-debug.h
+--- linux-4.9.22.orig/kernel/locking/rtmutex-debug.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/rtmutex-debug.h 2017-04-18 17:19:16.690773540 +0200
+@@ -9,9 +9,6 @@
+ * This file contains macros used solely by rtmutex.c. Debug version.
+ */
+
+-extern void
+-rt_mutex_deadlock_account_lock(struct rt_mutex *lock, struct task_struct *task);
+-extern void rt_mutex_deadlock_account_unlock(struct task_struct *task);
+ extern void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter);
+ extern void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter);
+ extern void debug_rt_mutex_init(struct rt_mutex *lock, const char *name);
+diff -Nur linux-4.9.22.orig/kernel/locking/rtmutex.h linux-4.9.22/kernel/locking/rtmutex.h
+--- linux-4.9.22.orig/kernel/locking/rtmutex.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/rtmutex.h 2017-04-18 17:19:16.690773540 +0200
+@@ -11,8 +11,6 @@
+ */
+
+ #define rt_mutex_deadlock_check(l) (0)
+-#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)
+-#define rt_mutex_deadlock_account_unlock(l) do { } while (0)
+ #define debug_rt_mutex_init_waiter(w) do { } while (0)
+ #define debug_rt_mutex_free_waiter(w) do { } while (0)
+ #define debug_rt_mutex_lock(l) do { } while (0)
+diff -Nur linux-4.9.22.orig/kernel/locking/rwsem-rt.c linux-4.9.22/kernel/locking/rwsem-rt.c
+--- linux-4.9.22.orig/kernel/locking/rwsem-rt.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/kernel/locking/rwsem-rt.c 2017-04-18 17:19:16.690773540 +0200
+@@ -0,0 +1,268 @@
++/*
++ */
++#include <linux/rwsem.h>
++#include <linux/sched.h>
++#include <linux/export.h>
++
++#include "rtmutex_common.h"
++
++/*
++ * RT-specific reader/writer semaphores
++ *
++ * down_write()
++ * 1) Lock sem->rtmutex
++ * 2) Remove the reader BIAS to force readers into the slow path
++ * 3) Wait until all readers have left the critical region
++ * 4) Mark it write locked
++ *
++ * up_write()
++ * 1) Remove the write locked marker
++ * 2) Set the reader BIAS so readers can use the fast path again
++ * 3) Unlock sem->rtmutex to release blocked readers
++ *
++ * down_read()
++ * 1) Try fast path acquisition (reader BIAS is set)
++ * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag
++ * 3) If !writelocked, acquire it for read
++ * 4) If writelocked, block on sem->rtmutex
++ * 5) unlock sem->rtmutex, goto 1)
++ *
++ * up_read()
++ * 1) Try fast path release (reader count != 1)
++ * 2) Wake the writer waiting in down_write()#3
++ *
++ * down_read()#3 has the consequence, that rw semaphores on RT are not writer
++ * fair, but writers, which should be avoided in RT tasks (think mmap_sem),
++ * are subject to the rtmutex priority/DL inheritance mechanism.
++ *
++ * It's possible to make the rw semaphores writer fair by keeping a list of
++ * active readers. A blocked writer would force all newly incoming readers to
++ * block on the rtmutex, but the rtmutex would have to be proxy locked for one
++ * reader after the other. We can't use multi-reader inheritance because there
++ * is no way to support that with SCHED_DEADLINE. Implementing the one by one
++ * reader boosting/handover mechanism is a major surgery for a very dubious
++ * value.
++ *
++ * The risk of writer starvation is there, but the pathological use cases
++ * which trigger it are not necessarily the typical RT workloads.
++ */
++
++void __rwsem_init(struct rw_semaphore *sem, const char *name,
++ struct lock_class_key *key)
+{
-+ debug_rt_mutex_init_waiter(waiter);
-+ waiter->task = NULL;
-+ waiter->savestate = savestate;
-+ RB_CLEAR_NODE(&waiter->pi_tree_entry);
-+ RB_CLEAR_NODE(&waiter->tree_entry);
++#ifdef CONFIG_DEBUG_LOCK_ALLOC
++ /*
++ * Make sure we are not reinitializing a held semaphore:
++ */
++ debug_check_no_locks_freed((void *)sem, sizeof(*sem));
++ lockdep_init_map(&sem->dep_map, name, key, 0);
++#endif
++ atomic_set(&sem->readers, READER_BIAS);
+}
++EXPORT_SYMBOL(__rwsem_init);
+
- #endif
-diff -Nur linux-4.9.6.orig/kernel/locking/spinlock.c linux-4.9.6/kernel/locking/spinlock.c
---- linux-4.9.6.orig/kernel/locking/spinlock.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/spinlock.c 2017-01-28 13:59:10.035660185 +0100
++int __down_read_trylock(struct rw_semaphore *sem)
++{
++ int r, old;
++
++ /*
++ * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is
++ * set.
++ */
++ for (r = atomic_read(&sem->readers); r < 0;) {
++ old = atomic_cmpxchg(&sem->readers, r, r + 1);
++ if (likely(old == r))
++ return 1;
++ r = old;
++ }
++ return 0;
++}
++
++void __sched __down_read(struct rw_semaphore *sem)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ struct rt_mutex_waiter waiter;
++
++ if (__down_read_trylock(sem))
++ return;
++
++ might_sleep();
++ raw_spin_lock_irq(&m->wait_lock);
++ /*
++ * Allow readers as long as the writer has not completely
++ * acquired the semaphore for write.
++ */
++ if (atomic_read(&sem->readers) != WRITER_BIAS) {
++ atomic_inc(&sem->readers);
++ raw_spin_unlock_irq(&m->wait_lock);
++ return;
++ }
++
++ /*
++ * Call into the slow lock path with the rtmutex->wait_lock
++ * held, so this can't result in the following race:
++ *
++ * Reader1 Reader2 Writer
++ * down_read()
++ * down_write()
++ * rtmutex_lock(m)
++ * swait()
++ * down_read()
++ * unlock(m->wait_lock)
++ * up_read()
++ * swake()
++ * lock(m->wait_lock)
++ * sem->writelocked=true
++ * unlock(m->wait_lock)
++ *
++ * up_write()
++ * sem->writelocked=false
++ * rtmutex_unlock(m)
++ * down_read()
++ * down_write()
++ * rtmutex_lock(m)
++ * swait()
++ * rtmutex_lock(m)
++ *
++ * That would put Reader1 behind the writer waiting on
++ * Reader2 to call up_read() which might be unbound.
++ */
++ rt_mutex_init_waiter(&waiter, false);
++ rt_mutex_slowlock_locked(m, TASK_UNINTERRUPTIBLE, NULL,
++ RT_MUTEX_MIN_CHAINWALK, NULL,
++ &waiter);
++ /*
++ * The slowlock() above is guaranteed to return with the rtmutex is
++ * now held, so there can't be a writer active. Increment the reader
++ * count and immediately drop the rtmutex again.
++ */
++ atomic_inc(&sem->readers);
++ raw_spin_unlock_irq(&m->wait_lock);
++ rt_mutex_unlock(m);
++
++ debug_rt_mutex_free_waiter(&waiter);
++}
++
++void __up_read(struct rw_semaphore *sem)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ struct task_struct *tsk;
++
++ /*
++ * sem->readers can only hit 0 when a writer is waiting for the
++ * active readers to leave the critical region.
++ */
++ if (!atomic_dec_and_test(&sem->readers))
++ return;
++
++ might_sleep();
++ raw_spin_lock_irq(&m->wait_lock);
++ /*
++ * Wake the writer, i.e. the rtmutex owner. It might release the
++ * rtmutex concurrently in the fast path (due to a signal), but to
++ * clean up the rwsem it needs to acquire m->wait_lock. The worst
++ * case which can happen is a spurious wakeup.
++ */
++ tsk = rt_mutex_owner(m);
++ if (tsk)
++ wake_up_process(tsk);
++
++ raw_spin_unlock_irq(&m->wait_lock);
++}
++
++static void __up_write_unlock(struct rw_semaphore *sem, int bias,
++ unsigned long flags)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++
++ atomic_add(READER_BIAS - bias, &sem->readers);
++ raw_spin_unlock_irqrestore(&m->wait_lock, flags);
++ rt_mutex_unlock(m);
++}
++
++static int __sched __down_write_common(struct rw_semaphore *sem, int state)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ unsigned long flags;
++
++ /* Take the rtmutex as a first step */
++ if (rt_mutex_lock_state(m, state))
++ return -EINTR;
++
++ /* Force readers into slow path */
++ atomic_sub(READER_BIAS, &sem->readers);
++ might_sleep();
++
++ set_current_state(state);
++ for (;;) {
++ raw_spin_lock_irqsave(&m->wait_lock, flags);
++ /* Have all readers left the critical region? */
++ if (!atomic_read(&sem->readers)) {
++ atomic_set(&sem->readers, WRITER_BIAS);
++ __set_current_state(TASK_RUNNING);
++ raw_spin_unlock_irqrestore(&m->wait_lock, flags);
++ return 0;
++ }
++
++ if (signal_pending_state(state, current)) {
++ __set_current_state(TASK_RUNNING);
++ __up_write_unlock(sem, 0, flags);
++ return -EINTR;
++ }
++ raw_spin_unlock_irqrestore(&m->wait_lock, flags);
++
++ if (atomic_read(&sem->readers) != 0) {
++ schedule();
++ set_current_state(state);
++ }
++ }
++}
++
++void __sched __down_write(struct rw_semaphore *sem)
++{
++ __down_write_common(sem, TASK_UNINTERRUPTIBLE);
++}
++
++int __sched __down_write_killable(struct rw_semaphore *sem)
++{
++ return __down_write_common(sem, TASK_KILLABLE);
++}
++
++int __down_write_trylock(struct rw_semaphore *sem)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ unsigned long flags;
++
++ if (!rt_mutex_trylock(m))
++ return 0;
++
++ atomic_sub(READER_BIAS, &sem->readers);
++
++ raw_spin_lock_irqsave(&m->wait_lock, flags);
++ if (!atomic_read(&sem->readers)) {
++ atomic_set(&sem->readers, WRITER_BIAS);
++ raw_spin_unlock_irqrestore(&m->wait_lock, flags);
++ return 1;
++ }
++ __up_write_unlock(sem, 0, flags);
++ return 0;
++}
++
++void __up_write(struct rw_semaphore *sem)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ unsigned long flags;
++
++ raw_spin_lock_irqsave(&m->wait_lock, flags);
++ __up_write_unlock(sem, WRITER_BIAS, flags);
++}
++
++void __downgrade_write(struct rw_semaphore *sem)
++{
++ struct rt_mutex *m = &sem->rtmutex;
++ unsigned long flags;
++
++ raw_spin_lock_irqsave(&m->wait_lock, flags);
++ /* Release it and account current as reader */
++ __up_write_unlock(sem, WRITER_BIAS - 1, flags);
++}
+diff -Nur linux-4.9.22.orig/kernel/locking/spinlock.c linux-4.9.22/kernel/locking/spinlock.c
+--- linux-4.9.22.orig/kernel/locking/spinlock.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/spinlock.c 2017-04-18 17:19:16.690773540 +0200
@@ -124,8 +124,11 @@
* __[spin|read|write]_lock_bh()
*/
@@ -13439,9 +15277,9 @@ diff -Nur linux-4.9.6.orig/kernel/locking/spinlock.c linux-4.9.6/kernel/locking/
#ifdef CONFIG_DEBUG_LOCK_ALLOC
void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass)
-diff -Nur linux-4.9.6.orig/kernel/locking/spinlock_debug.c linux-4.9.6/kernel/locking/spinlock_debug.c
---- linux-4.9.6.orig/kernel/locking/spinlock_debug.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/locking/spinlock_debug.c 2017-01-28 13:59:10.035660185 +0100
+diff -Nur linux-4.9.22.orig/kernel/locking/spinlock_debug.c linux-4.9.22/kernel/locking/spinlock_debug.c
+--- linux-4.9.22.orig/kernel/locking/spinlock_debug.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/locking/spinlock_debug.c 2017-04-18 17:19:16.690773540 +0200
@@ -31,6 +31,7 @@
EXPORT_SYMBOL(__raw_spin_lock_init);
@@ -13472,9 +15310,81 @@ diff -Nur linux-4.9.6.orig/kernel/locking/spinlock_debug.c linux-4.9.6/kernel/lo
}
+
+#endif
-diff -Nur linux-4.9.6.orig/kernel/panic.c linux-4.9.6/kernel/panic.c
---- linux-4.9.6.orig/kernel/panic.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/panic.c 2017-01-28 13:59:10.035660185 +0100
+diff -Nur linux-4.9.22.orig/kernel/module.c linux-4.9.22/kernel/module.c
+--- linux-4.9.22.orig/kernel/module.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/module.c 2017-04-18 17:19:16.690773540 +0200
+@@ -660,16 +660,7 @@
+ memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
+ }
+
+-/**
+- * is_module_percpu_address - test whether address is from module static percpu
+- * @addr: address to test
+- *
+- * Test whether @addr belongs to module static percpu area.
+- *
+- * RETURNS:
+- * %true if @addr is from module static percpu area
+- */
+-bool is_module_percpu_address(unsigned long addr)
++bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
+ {
+ struct module *mod;
+ unsigned int cpu;
+@@ -683,9 +674,15 @@
+ continue;
+ for_each_possible_cpu(cpu) {
+ void *start = per_cpu_ptr(mod->percpu, cpu);
++ void *va = (void *)addr;
+
+- if ((void *)addr >= start &&
+- (void *)addr < start + mod->percpu_size) {
++ if (va >= start && va < start + mod->percpu_size) {
++ if (can_addr) {
++ *can_addr = (unsigned long) (va - start);
++ *can_addr += (unsigned long)
++ per_cpu_ptr(mod->percpu,
++ get_boot_cpu_id());
++ }
+ preempt_enable();
+ return true;
+ }
+@@ -696,6 +693,20 @@
+ return false;
+ }
+
++/**
++ * is_module_percpu_address - test whether address is from module static percpu
++ * @addr: address to test
++ *
++ * Test whether @addr belongs to module static percpu area.
++ *
++ * RETURNS:
++ * %true if @addr is from module static percpu area
++ */
++bool is_module_percpu_address(unsigned long addr)
++{
++ return __is_module_percpu_address(addr, NULL);
++}
++
+ #else /* ... !CONFIG_SMP */
+
+ static inline void __percpu *mod_percpu(struct module *mod)
+@@ -726,6 +737,11 @@
+ {
+ return false;
+ }
++
++bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
++{
++ return false;
++}
+
+ #endif /* CONFIG_SMP */
+
+diff -Nur linux-4.9.22.orig/kernel/panic.c linux-4.9.22/kernel/panic.c
+--- linux-4.9.22.orig/kernel/panic.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/panic.c 2017-04-18 17:19:16.690773540 +0200
@@ -482,9 +482,11 @@
static int init_oops_id(void)
@@ -13487,9 +15397,9 @@ diff -Nur linux-4.9.6.orig/kernel/panic.c linux-4.9.6/kernel/panic.c
oops_id++;
return 0;
-diff -Nur linux-4.9.6.orig/kernel/power/hibernate.c linux-4.9.6/kernel/power/hibernate.c
---- linux-4.9.6.orig/kernel/power/hibernate.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/power/hibernate.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/power/hibernate.c linux-4.9.22/kernel/power/hibernate.c
+--- linux-4.9.22.orig/kernel/power/hibernate.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/power/hibernate.c 2017-04-18 17:19:16.690773540 +0200
@@ -286,6 +286,8 @@
local_irq_disable();
@@ -13567,9 +15477,9 @@ diff -Nur linux-4.9.6.orig/kernel/power/hibernate.c linux-4.9.6/kernel/power/hib
return error;
}
-diff -Nur linux-4.9.6.orig/kernel/power/suspend.c linux-4.9.6/kernel/power/suspend.c
---- linux-4.9.6.orig/kernel/power/suspend.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/power/suspend.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/power/suspend.c linux-4.9.22/kernel/power/suspend.c
+--- linux-4.9.22.orig/kernel/power/suspend.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/power/suspend.c 2017-04-18 17:19:16.690773540 +0200
@@ -369,6 +369,8 @@
arch_suspend_disable_irqs();
BUG_ON(!irqs_disabled());
@@ -13614,9 +15524,9 @@ diff -Nur linux-4.9.6.orig/kernel/power/suspend.c linux-4.9.6/kernel/power/suspe
return error;
}
EXPORT_SYMBOL(pm_suspend);
-diff -Nur linux-4.9.6.orig/kernel/printk/printk.c linux-4.9.6/kernel/printk/printk.c
---- linux-4.9.6.orig/kernel/printk/printk.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/printk/printk.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/printk/printk.c linux-4.9.22/kernel/printk/printk.c
+--- linux-4.9.22.orig/kernel/printk/printk.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/printk/printk.c 2017-04-18 17:19:16.690773540 +0200
@@ -351,6 +351,65 @@
*/
DEFINE_RAW_SPINLOCK(logbuf_lock);
@@ -13879,9 +15789,9 @@ diff -Nur linux-4.9.6.orig/kernel/printk/printk.c linux-4.9.6/kernel/printk/prin
/*
* console_unblank can no longer be called in interrupt context unless
* oops_in_progress is set to 1..
-diff -Nur linux-4.9.6.orig/kernel/ptrace.c linux-4.9.6/kernel/ptrace.c
---- linux-4.9.6.orig/kernel/ptrace.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/ptrace.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/ptrace.c linux-4.9.22/kernel/ptrace.c
+--- linux-4.9.22.orig/kernel/ptrace.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/ptrace.c 2017-04-18 17:19:16.690773540 +0200
@@ -166,7 +166,14 @@
spin_lock_irq(&task->sighand->siglock);
@@ -13898,9 +15808,9 @@ diff -Nur linux-4.9.6.orig/kernel/ptrace.c linux-4.9.6/kernel/ptrace.c
ret = true;
}
spin_unlock_irq(&task->sighand->siglock);
-diff -Nur linux-4.9.6.orig/kernel/rcu/rcutorture.c linux-4.9.6/kernel/rcu/rcutorture.c
---- linux-4.9.6.orig/kernel/rcu/rcutorture.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/rcu/rcutorture.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/rcu/rcutorture.c linux-4.9.22/kernel/rcu/rcutorture.c
+--- linux-4.9.22.orig/kernel/rcu/rcutorture.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/rcu/rcutorture.c 2017-04-18 17:19:16.694773696 +0200
@@ -404,6 +404,7 @@
.name = "rcu"
};
@@ -13922,9 +15832,9 @@ diff -Nur linux-4.9.6.orig/kernel/rcu/rcutorture.c linux-4.9.6/kernel/rcu/rcutor
/*
* Don't even think about trying any of these in real life!!!
* The names includes "busted", and they really means it!
-diff -Nur linux-4.9.6.orig/kernel/rcu/tree.c linux-4.9.6/kernel/rcu/tree.c
---- linux-4.9.6.orig/kernel/rcu/tree.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/rcu/tree.c 2017-01-28 13:59:10.039660339 +0100
+diff -Nur linux-4.9.22.orig/kernel/rcu/tree.c linux-4.9.22/kernel/rcu/tree.c
+--- linux-4.9.22.orig/kernel/rcu/tree.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/rcu/tree.c 2017-04-18 17:19:16.694773696 +0200
@@ -55,6 +55,11 @@
#include <linux/random.h>
#include <linux/trace_events.h>
@@ -14225,9 +16135,9 @@ diff -Nur linux-4.9.6.orig/kernel/rcu/tree.c linux-4.9.6/kernel/rcu/tree.c
/*
* We don't need protection against CPU-hotplug here because
-diff -Nur linux-4.9.6.orig/kernel/rcu/tree.h linux-4.9.6/kernel/rcu/tree.h
---- linux-4.9.6.orig/kernel/rcu/tree.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/rcu/tree.h 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/rcu/tree.h linux-4.9.22/kernel/rcu/tree.h
+--- linux-4.9.22.orig/kernel/rcu/tree.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/rcu/tree.h 2017-04-18 17:19:16.694773696 +0200
@@ -588,18 +588,18 @@
*/
extern struct rcu_state rcu_sched_state;
@@ -14261,9 +16171,9 @@ diff -Nur linux-4.9.6.orig/kernel/rcu/tree.h linux-4.9.6/kernel/rcu/tree.h
static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp,
struct rcu_node *rnp);
#endif /* #ifdef CONFIG_RCU_BOOST */
-diff -Nur linux-4.9.6.orig/kernel/rcu/tree_plugin.h linux-4.9.6/kernel/rcu/tree_plugin.h
---- linux-4.9.6.orig/kernel/rcu/tree_plugin.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/rcu/tree_plugin.h 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/rcu/tree_plugin.h linux-4.9.22/kernel/rcu/tree_plugin.h
+--- linux-4.9.22.orig/kernel/rcu/tree_plugin.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/rcu/tree_plugin.h 2017-04-18 17:19:16.694773696 +0200
@@ -24,25 +24,10 @@
* Paul E. McKenney <paulmck@linux.vnet.ibm.com>
*/
@@ -14534,9 +16444,9 @@ diff -Nur linux-4.9.6.orig/kernel/rcu/tree_plugin.h linux-4.9.6/kernel/rcu/tree_
/*
* Prepare a CPU for idle from an RCU perspective. The first major task
-diff -Nur linux-4.9.6.orig/kernel/rcu/update.c linux-4.9.6/kernel/rcu/update.c
---- linux-4.9.6.orig/kernel/rcu/update.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/rcu/update.c 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/rcu/update.c linux-4.9.22/kernel/rcu/update.c
+--- linux-4.9.22.orig/kernel/rcu/update.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/rcu/update.c 2017-04-18 17:19:16.694773696 +0200
@@ -62,7 +62,7 @@
#ifndef CONFIG_TINY_RCU
module_param(rcu_expedited, int, 0);
@@ -14582,9 +16492,9 @@ diff -Nur linux-4.9.6.orig/kernel/rcu/update.c linux-4.9.6/kernel/rcu/update.c
#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */
-diff -Nur linux-4.9.6.orig/kernel/sched/completion.c linux-4.9.6/kernel/sched/completion.c
---- linux-4.9.6.orig/kernel/sched/completion.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/completion.c 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/completion.c linux-4.9.22/kernel/sched/completion.c
+--- linux-4.9.22.orig/kernel/sched/completion.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/completion.c 2017-04-18 17:19:16.694773696 +0200
@@ -30,10 +30,10 @@
{
unsigned long flags;
@@ -14675,9 +16585,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/completion.c linux-4.9.6/kernel/sched/co
return true;
}
EXPORT_SYMBOL(completion_done);
-diff -Nur linux-4.9.6.orig/kernel/sched/core.c linux-4.9.6/kernel/sched/core.c
---- linux-4.9.6.orig/kernel/sched/core.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/core.c 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/core.c linux-4.9.22/kernel/sched/core.c
+--- linux-4.9.22.orig/kernel/sched/core.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/core.c 2017-04-18 17:19:16.694773696 +0200
@@ -129,7 +129,11 @@
* Number of tasks to iterate in a single balance run.
* Limited because this is done with IRQs disabled.
@@ -15365,9 +17275,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/core.c linux-4.9.6/kernel/sched/core.c
return (nested == preempt_offset);
}
-diff -Nur linux-4.9.6.orig/kernel/sched/deadline.c linux-4.9.6/kernel/sched/deadline.c
---- linux-4.9.6.orig/kernel/sched/deadline.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/deadline.c 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/deadline.c linux-4.9.22/kernel/sched/deadline.c
+--- linux-4.9.22.orig/kernel/sched/deadline.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/deadline.c 2017-04-18 17:19:16.694773696 +0200
@@ -687,6 +687,7 @@
hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
@@ -15376,9 +17286,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/deadline.c linux-4.9.6/kernel/sched/dead
}
static
-diff -Nur linux-4.9.6.orig/kernel/sched/debug.c linux-4.9.6/kernel/sched/debug.c
---- linux-4.9.6.orig/kernel/sched/debug.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/debug.c 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/debug.c linux-4.9.22/kernel/sched/debug.c
+--- linux-4.9.22.orig/kernel/sched/debug.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/debug.c 2017-04-18 17:19:16.694773696 +0200
@@ -558,6 +558,9 @@
P(rt_throttled);
PN(rt_time);
@@ -15400,9 +17310,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/debug.c linux-4.9.6/kernel/sched/debug.c
#undef PN_SCHEDSTAT
#undef PN
#undef __PN
-diff -Nur linux-4.9.6.orig/kernel/sched/fair.c linux-4.9.6/kernel/sched/fair.c
---- linux-4.9.6.orig/kernel/sched/fair.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/fair.c 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/fair.c linux-4.9.22/kernel/sched/fair.c
+--- linux-4.9.22.orig/kernel/sched/fair.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/fair.c 2017-04-18 17:19:16.698773851 +0200
@@ -3518,7 +3518,7 @@
ideal_runtime = sched_slice(cfs_rq, curr);
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
@@ -15475,9 +17385,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/fair.c linux-4.9.6/kernel/sched/fair.c
} else
check_preempt_curr(rq, p, 0);
}
-diff -Nur linux-4.9.6.orig/kernel/sched/features.h linux-4.9.6/kernel/sched/features.h
---- linux-4.9.6.orig/kernel/sched/features.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/features.h 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/features.h linux-4.9.22/kernel/sched/features.h
+--- linux-4.9.22.orig/kernel/sched/features.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/features.h 2017-04-18 17:19:16.698773851 +0200
@@ -45,11 +45,19 @@
*/
SCHED_FEAT(NONTASK_CAPACITY, true)
@@ -15498,9 +17408,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/features.h linux-4.9.6/kernel/sched/feat
#ifdef HAVE_RT_PUSH_IPI
/*
-diff -Nur linux-4.9.6.orig/kernel/sched/Makefile linux-4.9.6/kernel/sched/Makefile
---- linux-4.9.6.orig/kernel/sched/Makefile 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/Makefile 2017-01-28 13:59:10.043660493 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/Makefile linux-4.9.22/kernel/sched/Makefile
+--- linux-4.9.22.orig/kernel/sched/Makefile 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/Makefile 2017-04-18 17:19:16.694773696 +0200
@@ -17,7 +17,7 @@
obj-y += core.o loadavg.o clock.o cputime.o
@@ -15510,9 +17420,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/Makefile linux-4.9.6/kernel/sched/Makefi
obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o
obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o
obj-$(CONFIG_SCHEDSTATS) += stats.o
-diff -Nur linux-4.9.6.orig/kernel/sched/rt.c linux-4.9.6/kernel/sched/rt.c
---- linux-4.9.6.orig/kernel/sched/rt.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/rt.c 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/rt.c linux-4.9.22/kernel/sched/rt.c
+--- linux-4.9.22.orig/kernel/sched/rt.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/rt.c 2017-04-18 17:19:16.698773851 +0200
@@ -47,6 +47,7 @@
hrtimer_init(&rt_b->rt_period_timer,
@@ -15529,9 +17439,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/rt.c linux-4.9.6/kernel/sched/rt.c
#endif
#endif /* CONFIG_SMP */
/* We start is dequeued state, because no RT tasks are queued */
-diff -Nur linux-4.9.6.orig/kernel/sched/sched.h linux-4.9.6/kernel/sched/sched.h
---- linux-4.9.6.orig/kernel/sched/sched.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/sched.h 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/sched.h linux-4.9.22/kernel/sched/sched.h
+--- linux-4.9.22.orig/kernel/sched/sched.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/sched.h 2017-04-18 17:19:16.698773851 +0200
@@ -1163,6 +1163,7 @@
#define WF_SYNC 0x01 /* waker goes to sleep after wakeup */
#define WF_FORK 0x02 /* child wakeup after fork */
@@ -15556,9 +17466,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/sched.h linux-4.9.6/kernel/sched/sched.h
extern struct rt_bandwidth def_rt_bandwidth;
extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime);
-diff -Nur linux-4.9.6.orig/kernel/sched/swait.c linux-4.9.6/kernel/sched/swait.c
---- linux-4.9.6.orig/kernel/sched/swait.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/sched/swait.c 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/swait.c linux-4.9.22/kernel/sched/swait.c
+--- linux-4.9.22.orig/kernel/sched/swait.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/sched/swait.c 2017-04-18 17:19:16.698773851 +0200
@@ -1,5 +1,6 @@
#include <linux/sched.h>
#include <linux/swait.h>
@@ -15600,9 +17510,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/swait.c linux-4.9.6/kernel/sched/swait.c
raw_spin_lock_irq(&q->lock);
list_splice_init(&q->task_list, &tmp);
while (!list_empty(&tmp)) {
-diff -Nur linux-4.9.6.orig/kernel/sched/swork.c linux-4.9.6/kernel/sched/swork.c
---- linux-4.9.6.orig/kernel/sched/swork.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/kernel/sched/swork.c 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/sched/swork.c linux-4.9.22/kernel/sched/swork.c
+--- linux-4.9.22.orig/kernel/sched/swork.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/kernel/sched/swork.c 2017-04-18 17:19:16.698773851 +0200
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2014 BMW Car IT GmbH, Daniel Wagner daniel.wagner@bmw-carit.de
@@ -15777,9 +17687,9 @@ diff -Nur linux-4.9.6.orig/kernel/sched/swork.c linux-4.9.6/kernel/sched/swork.c
+ mutex_unlock(&worker_mutex);
+}
+EXPORT_SYMBOL_GPL(swork_put);
-diff -Nur linux-4.9.6.orig/kernel/signal.c linux-4.9.6/kernel/signal.c
---- linux-4.9.6.orig/kernel/signal.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/signal.c 2017-01-28 13:59:10.047660646 +0100
+diff -Nur linux-4.9.22.orig/kernel/signal.c linux-4.9.22/kernel/signal.c
+--- linux-4.9.22.orig/kernel/signal.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/signal.c 2017-04-18 17:19:16.698773851 +0200
@@ -14,6 +14,7 @@
#include <linux/export.h>
#include <linux/init.h>
@@ -16009,9 +17919,9 @@ diff -Nur linux-4.9.6.orig/kernel/signal.c linux-4.9.6/kernel/signal.c
freezable_schedule();
} else {
/*
-diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
---- linux-4.9.6.orig/kernel/softirq.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/softirq.c 2017-01-28 13:59:10.083662028 +0100
+diff -Nur linux-4.9.22.orig/kernel/softirq.c linux-4.9.22/kernel/softirq.c
+--- linux-4.9.22.orig/kernel/softirq.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/softirq.c 2017-04-18 17:19:16.698773851 +0200
@@ -21,10 +21,12 @@
#include <linux/freezer.h>
#include <linux/kthread.h>
@@ -16134,7 +18044,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
/*
* we cannot loop indefinitely here to avoid userspace starvation,
* but we also don't want to introduce a worst case 1/HZ latency
-@@ -77,6 +175,37 @@
+@@ -77,6 +175,38 @@
wake_up_process(tsk);
}
@@ -16169,14 +18079,14 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
+ }
+}
+
++#ifndef CONFIG_PREEMPT_RT_FULL
/*
* If ksoftirqd is scheduled, we do not want to process pending softirqs
* right now. Let ksoftirqd handle this at its own rate, to get fairness.
-@@ -88,6 +217,48 @@
+@@ -88,6 +218,47 @@
return tsk && (tsk->state == TASK_RUNNING);
}
-+#ifndef CONFIG_PREEMPT_RT_FULL
+static inline int ksoftirqd_softirq_pending(void)
+{
+ return local_softirq_pending();
@@ -16592,26 +18502,20 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
}
__irq_enter();
-@@ -351,9 +794,13 @@
+@@ -351,6 +794,7 @@
static inline void invoke_softirq(void)
{
-+#ifdef CONFIG_PREEMPT_RT_FULL
-+ unsigned long flags;
-+#endif
-+
++#ifndef CONFIG_PREEMPT_RT_FULL
if (ksoftirqd_running())
return;
--
-+#ifndef CONFIG_PREEMPT_RT_FULL
- if (!force_irqthreads) {
- #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
- /*
-@@ -373,6 +820,17 @@
+
+@@ -373,6 +817,18 @@
} else {
wakeup_softirqd();
}
+#else /* PREEMPT_RT_FULL */
++ unsigned long flags;
+
+ local_irq_save(flags);
+ if (__this_cpu_read(ksoftirqd) &&
@@ -16625,7 +18529,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
}
static inline void tick_irq_exit(void)
-@@ -409,26 +867,6 @@
+@@ -409,26 +865,6 @@
trace_hardirq_exit(); /* must be last! */
}
@@ -16652,7 +18556,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
void raise_softirq(unsigned int nr)
{
unsigned long flags;
-@@ -438,12 +876,6 @@
+@@ -438,12 +874,6 @@
local_irq_restore(flags);
}
@@ -16665,7 +18569,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
softirq_vec[nr].action = action;
-@@ -460,15 +892,45 @@
+@@ -460,15 +890,45 @@
static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
@@ -16715,7 +18619,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
local_irq_restore(flags);
}
EXPORT_SYMBOL(__tasklet_schedule);
-@@ -478,10 +940,7 @@
+@@ -478,10 +938,7 @@
unsigned long flags;
local_irq_save(flags);
@@ -16727,7 +18631,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
local_irq_restore(flags);
}
EXPORT_SYMBOL(__tasklet_hi_schedule);
-@@ -490,82 +949,122 @@
+@@ -490,82 +947,122 @@
{
BUG_ON(!irqs_disabled());
@@ -16899,7 +18803,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
}
void tasklet_init(struct tasklet_struct *t,
-@@ -586,7 +1085,7 @@
+@@ -586,7 +1083,7 @@
while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
do {
@@ -16908,7 +18812,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
} while (test_bit(TASKLET_STATE_SCHED, &t->state));
}
tasklet_unlock_wait(t);
-@@ -660,25 +1159,26 @@
+@@ -660,25 +1157,26 @@
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}
@@ -16950,7 +18854,7 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
}
#ifdef CONFIG_HOTPLUG_CPU
-@@ -745,17 +1245,31 @@
+@@ -745,17 +1243,31 @@
static struct smp_hotplug_thread softirq_threads = {
.store = &ksoftirqd,
@@ -16983,9 +18887,9 @@ diff -Nur linux-4.9.6.orig/kernel/softirq.c linux-4.9.6/kernel/softirq.c
return 0;
}
early_initcall(spawn_ksoftirqd);
-diff -Nur linux-4.9.6.orig/kernel/stop_machine.c linux-4.9.6/kernel/stop_machine.c
---- linux-4.9.6.orig/kernel/stop_machine.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/stop_machine.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/stop_machine.c linux-4.9.22/kernel/stop_machine.c
+--- linux-4.9.22.orig/kernel/stop_machine.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/stop_machine.c 2017-04-18 17:19:16.698773851 +0200
@@ -36,7 +36,7 @@
struct cpu_stopper {
struct task_struct *thread;
@@ -17080,9 +18984,9 @@ diff -Nur linux-4.9.6.orig/kernel/stop_machine.c linux-4.9.6/kernel/stop_machine
INIT_LIST_HEAD(&stopper->works);
}
-diff -Nur linux-4.9.6.orig/kernel/time/hrtimer.c linux-4.9.6/kernel/time/hrtimer.c
---- linux-4.9.6.orig/kernel/time/hrtimer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/hrtimer.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/hrtimer.c linux-4.9.22/kernel/time/hrtimer.c
+--- linux-4.9.22.orig/kernel/time/hrtimer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/hrtimer.c 2017-04-18 17:19:16.698773851 +0200
@@ -53,6 +53,7 @@
#include <asm/uaccess.h>
@@ -17510,9 +19414,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/hrtimer.c linux-4.9.6/kernel/time/hrtimer
}
/**
-diff -Nur linux-4.9.6.orig/kernel/time/itimer.c linux-4.9.6/kernel/time/itimer.c
---- linux-4.9.6.orig/kernel/time/itimer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/itimer.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/itimer.c linux-4.9.22/kernel/time/itimer.c
+--- linux-4.9.22.orig/kernel/time/itimer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/itimer.c 2017-04-18 17:19:16.698773851 +0200
@@ -213,6 +213,7 @@
/* We are sharing ->siglock with it_real_fn() */
if (hrtimer_try_to_cancel(timer) < 0) {
@@ -17521,9 +19425,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/itimer.c linux-4.9.6/kernel/time/itimer.c
goto again;
}
expires = timeval_to_ktime(value->it_value);
-diff -Nur linux-4.9.6.orig/kernel/time/jiffies.c linux-4.9.6/kernel/time/jiffies.c
---- linux-4.9.6.orig/kernel/time/jiffies.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/jiffies.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/jiffies.c linux-4.9.22/kernel/time/jiffies.c
+--- linux-4.9.22.orig/kernel/time/jiffies.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/jiffies.c 2017-04-18 17:19:16.698773851 +0200
@@ -74,7 +74,8 @@
.max_cycles = 10,
};
@@ -17546,9 +19450,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/jiffies.c linux-4.9.6/kernel/time/jiffies
return ret;
}
EXPORT_SYMBOL(get_jiffies_64);
-diff -Nur linux-4.9.6.orig/kernel/time/ntp.c linux-4.9.6/kernel/time/ntp.c
---- linux-4.9.6.orig/kernel/time/ntp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/ntp.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/ntp.c linux-4.9.22/kernel/time/ntp.c
+--- linux-4.9.22.orig/kernel/time/ntp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/ntp.c 2017-04-18 17:19:16.702774006 +0200
@@ -17,6 +17,7 @@
#include <linux/module.h>
#include <linux/rtc.h>
@@ -17593,9 +19497,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/ntp.c linux-4.9.6/kernel/time/ntp.c
#else
void ntp_notify_cmos_timer(void) { }
-diff -Nur linux-4.9.6.orig/kernel/time/posix-cpu-timers.c linux-4.9.6/kernel/time/posix-cpu-timers.c
---- linux-4.9.6.orig/kernel/time/posix-cpu-timers.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/posix-cpu-timers.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/posix-cpu-timers.c linux-4.9.22/kernel/time/posix-cpu-timers.c
+--- linux-4.9.22.orig/kernel/time/posix-cpu-timers.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/posix-cpu-timers.c 2017-04-18 17:19:16.702774006 +0200
@@ -3,6 +3,7 @@
*/
@@ -17829,9 +19733,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/posix-cpu-timers.c linux-4.9.6/kernel/tim
/*
* Set one of the process-wide special case CPU timers or RLIMIT_CPU.
* The tsk->sighand->siglock must be held by the caller.
-diff -Nur linux-4.9.6.orig/kernel/time/posix-timers.c linux-4.9.6/kernel/time/posix-timers.c
---- linux-4.9.6.orig/kernel/time/posix-timers.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/posix-timers.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/posix-timers.c linux-4.9.22/kernel/time/posix-timers.c
+--- linux-4.9.22.orig/kernel/time/posix-timers.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/posix-timers.c 2017-04-18 17:19:16.702774006 +0200
@@ -506,6 +506,7 @@
static struct pid *good_sigevent(sigevent_t * event)
{
@@ -17927,9 +19831,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/posix-timers.c linux-4.9.6/kernel/time/po
goto retry_delete;
}
list_del(&timer->list);
-diff -Nur linux-4.9.6.orig/kernel/time/tick-broadcast-hrtimer.c linux-4.9.6/kernel/time/tick-broadcast-hrtimer.c
---- linux-4.9.6.orig/kernel/time/tick-broadcast-hrtimer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/tick-broadcast-hrtimer.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/tick-broadcast-hrtimer.c linux-4.9.22/kernel/time/tick-broadcast-hrtimer.c
+--- linux-4.9.22.orig/kernel/time/tick-broadcast-hrtimer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/tick-broadcast-hrtimer.c 2017-04-18 17:19:16.702774006 +0200
@@ -107,5 +107,6 @@
{
hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
@@ -17937,9 +19841,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/tick-broadcast-hrtimer.c linux-4.9.6/kern
+ bctimer.irqsafe = true;
clockevents_register_device(&ce_broadcast_hrtimer);
}
-diff -Nur linux-4.9.6.orig/kernel/time/tick-common.c linux-4.9.6/kernel/time/tick-common.c
---- linux-4.9.6.orig/kernel/time/tick-common.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/tick-common.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/tick-common.c linux-4.9.22/kernel/time/tick-common.c
+--- linux-4.9.22.orig/kernel/time/tick-common.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/tick-common.c 2017-04-18 17:19:16.702774006 +0200
@@ -79,13 +79,15 @@
static void tick_periodic(int cpu)
{
@@ -17970,9 +19874,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/tick-common.c linux-4.9.6/kernel/time/tic
clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT);
-diff -Nur linux-4.9.6.orig/kernel/time/tick-sched.c linux-4.9.6/kernel/time/tick-sched.c
---- linux-4.9.6.orig/kernel/time/tick-sched.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/tick-sched.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/tick-sched.c linux-4.9.22/kernel/time/tick-sched.c
+--- linux-4.9.22.orig/kernel/time/tick-sched.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/tick-sched.c 2017-04-18 17:19:16.702774006 +0200
@@ -62,7 +62,8 @@
return;
@@ -18060,9 +19964,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/tick-sched.c linux-4.9.6/kernel/time/tick
ts->sched_timer.function = tick_sched_timer;
/* Get the next period (per-CPU) */
-diff -Nur linux-4.9.6.orig/kernel/time/timekeeping.c linux-4.9.6/kernel/time/timekeeping.c
---- linux-4.9.6.orig/kernel/time/timekeeping.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/timekeeping.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/timekeeping.c linux-4.9.22/kernel/time/timekeeping.c
+--- linux-4.9.22.orig/kernel/time/timekeeping.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/timekeeping.c 2017-04-18 17:19:16.702774006 +0200
@@ -2328,8 +2328,10 @@
*/
void xtime_update(unsigned long ticks)
@@ -18076,9 +19980,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/timekeeping.c linux-4.9.6/kernel/time/tim
+ raw_spin_unlock(&jiffies_lock);
update_wall_time();
}
-diff -Nur linux-4.9.6.orig/kernel/time/timekeeping.h linux-4.9.6/kernel/time/timekeeping.h
---- linux-4.9.6.orig/kernel/time/timekeeping.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/timekeeping.h 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/timekeeping.h linux-4.9.22/kernel/time/timekeeping.h
+--- linux-4.9.22.orig/kernel/time/timekeeping.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/timekeeping.h 2017-04-18 17:19:16.702774006 +0200
@@ -19,7 +19,8 @@
extern void do_timer(unsigned long ticks);
extern void update_wall_time(void);
@@ -18089,9 +19993,9 @@ diff -Nur linux-4.9.6.orig/kernel/time/timekeeping.h linux-4.9.6/kernel/time/tim
#define CS_NAME_LEN 32
-diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
---- linux-4.9.6.orig/kernel/time/timer.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/time/timer.c 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/time/timer.c linux-4.9.22/kernel/time/timer.c
+--- linux-4.9.22.orig/kernel/time/timer.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/time/timer.c 2017-04-18 17:19:16.702774006 +0200
@@ -193,8 +193,11 @@
#endif
@@ -18105,7 +20009,16 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
unsigned long clk;
unsigned long next_expiry;
unsigned int cpu;
-@@ -948,10 +951,10 @@
+@@ -203,6 +206,8 @@
+ bool is_idle;
+ DECLARE_BITMAP(pending_map, WHEEL_SIZE);
+ struct hlist_head vectors[WHEEL_SIZE];
++ struct hlist_head expired_lists[LVL_DEPTH];
++ int expired_count;
+ } ____cacheline_aligned;
+
+ static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]);
+@@ -948,10 +953,10 @@
if (!(tf & TIMER_MIGRATING)) {
base = get_timer_base(tf);
@@ -18118,7 +20031,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
}
cpu_relax();
}
-@@ -1023,9 +1026,9 @@
+@@ -1023,9 +1028,9 @@
/* See the comment in lock_timer_base() */
timer->flags |= TIMER_MIGRATING;
@@ -18130,7 +20043,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
WRITE_ONCE(timer->flags,
(timer->flags & ~TIMER_BASEMASK) | base->cpu);
}
-@@ -1050,7 +1053,7 @@
+@@ -1050,7 +1055,7 @@
}
out_unlock:
@@ -18139,7 +20052,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
return ret;
}
-@@ -1144,19 +1147,46 @@
+@@ -1144,19 +1149,46 @@
if (base != new_base) {
timer->flags |= TIMER_MIGRATING;
@@ -18189,7 +20102,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
/**
* del_timer - deactive a timer.
* @timer: the timer to be deactivated
-@@ -1180,7 +1210,7 @@
+@@ -1180,7 +1212,7 @@
if (timer_pending(timer)) {
base = lock_timer_base(timer, &flags);
ret = detach_if_pending(timer, base, true);
@@ -18198,7 +20111,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
}
return ret;
-@@ -1208,13 +1238,13 @@
+@@ -1208,13 +1240,13 @@
timer_stats_timer_clear_start_info(timer);
ret = detach_if_pending(timer, base, true);
}
@@ -18214,7 +20127,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
/**
* del_timer_sync - deactivate a timer and wait for the handler to finish.
* @timer: the timer to be deactivated
-@@ -1274,7 +1304,7 @@
+@@ -1274,7 +1306,7 @@
int ret = try_to_del_timer_sync(timer);
if (ret >= 0)
return ret;
@@ -18223,7 +20136,17 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
}
}
EXPORT_SYMBOL(del_timer_sync);
-@@ -1339,14 +1369,17 @@
+@@ -1323,7 +1355,8 @@
+ }
+ }
+
+-static void expire_timers(struct timer_base *base, struct hlist_head *head)
++static inline void __expire_timers(struct timer_base *base,
++ struct hlist_head *head)
+ {
+ while (!hlist_empty(head)) {
+ struct timer_list *timer;
+@@ -1339,33 +1372,53 @@
fn = timer->function;
data = timer->data;
@@ -18246,7 +20169,56 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
}
}
}
-@@ -1515,7 +1548,7 @@
+
+-static int __collect_expired_timers(struct timer_base *base,
+- struct hlist_head *heads)
++static void expire_timers(struct timer_base *base)
++{
++ struct hlist_head *head;
++
++ while (base->expired_count--) {
++ head = base->expired_lists + base->expired_count;
++ __expire_timers(base, head);
++ }
++ base->expired_count = 0;
++}
++
++static void __collect_expired_timers(struct timer_base *base)
+ {
+ unsigned long clk = base->clk;
+ struct hlist_head *vec;
+- int i, levels = 0;
++ int i;
+ unsigned int idx;
+
++ /*
++ * expire_timers() must be called at least once before we can
++ * collect more timers
++ */
++ if (WARN_ON(base->expired_count))
++ return;
++
+ for (i = 0; i < LVL_DEPTH; i++) {
+ idx = (clk & LVL_MASK) + i * LVL_SIZE;
+
+ if (__test_and_clear_bit(idx, base->pending_map)) {
+ vec = base->vectors + idx;
+- hlist_move_list(vec, heads++);
+- levels++;
++ hlist_move_list(vec,
++ &base->expired_lists[base->expired_count++]);
+ }
+ /* Is it time to look at the next level? */
+ if (clk & LVL_CLK_MASK)
+@@ -1373,7 +1426,6 @@
+ /* Shift clock for the next level granularity */
+ clk >>= LVL_CLK_SHIFT;
+ }
+- return levels;
+ }
+
+ #ifdef CONFIG_NO_HZ_COMMON
+@@ -1515,7 +1567,7 @@
if (cpu_is_offline(smp_processor_id()))
return expires;
@@ -18255,7 +20227,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
nextevt = __next_timer_interrupt(base);
is_max_delta = (nextevt == base->clk + NEXT_TIMER_MAX_DELTA);
base->next_expiry = nextevt;
-@@ -1543,7 +1576,7 @@
+@@ -1543,7 +1595,7 @@
if ((expires - basem) > TICK_NSEC)
base->is_idle = true;
}
@@ -18264,7 +20236,72 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
return cmp_next_hrtimer_event(basem, expires);
}
-@@ -1608,13 +1641,13 @@
+@@ -1566,8 +1618,7 @@
+ base->is_idle = false;
+ }
+
+-static int collect_expired_timers(struct timer_base *base,
+- struct hlist_head *heads)
++static void collect_expired_timers(struct timer_base *base)
+ {
+ /*
+ * NOHZ optimization. After a long idle sleep we need to forward the
+@@ -1584,20 +1635,49 @@
+ if (time_after(next, jiffies)) {
+ /* The call site will increment clock! */
+ base->clk = jiffies - 1;
+- return 0;
++ return;
+ }
+ base->clk = next;
+ }
+- return __collect_expired_timers(base, heads);
++ __collect_expired_timers(base);
+ }
+ #else
+-static inline int collect_expired_timers(struct timer_base *base,
+- struct hlist_head *heads)
++static inline void collect_expired_timers(struct timer_base *base)
+ {
+- return __collect_expired_timers(base, heads);
++ __collect_expired_timers(base);
+ }
+ #endif
+
++static int find_expired_timers(struct timer_base *base)
++{
++ const unsigned long int end_clk = jiffies;
++
++ while (!base->expired_count && time_after_eq(end_clk, base->clk)) {
++ collect_expired_timers(base);
++ base->clk++;
++ }
++
++ return base->expired_count;
++}
++
++/* Called from CPU tick routine to quickly collect expired timers */
++static int tick_find_expired(struct timer_base *base)
++{
++ int count;
++
++ raw_spin_lock(&base->lock);
++
++ if (unlikely(time_after(jiffies, base->clk + HZ))) {
++ /* defer to ktimersoftd; don't spend too long in irq context */
++ count = -1;
++ } else
++ count = find_expired_timers(base);
++
++ raw_spin_unlock(&base->lock);
++
++ return count;
++}
++
+ /*
+ * Called from the timer interrupt handler to charge one tick to the current
+ * process. user_tick is 1 if the tick is user time, 0 for system.
+@@ -1608,13 +1688,13 @@
/* Note: this timer irq context must be accounted for as well. */
account_process_tick(p, user_tick);
@@ -18280,19 +20317,29 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
run_posix_cpu_timers(p);
}
-@@ -1630,7 +1663,7 @@
- if (!time_after_eq(jiffies, base->clk))
- return;
-
-- spin_lock_irq(&base->lock);
+@@ -1624,24 +1704,13 @@
+ */
+ static inline void __run_timers(struct timer_base *base)
+ {
+- struct hlist_head heads[LVL_DEPTH];
+- int levels;
+-
+- if (!time_after_eq(jiffies, base->clk))
+- return;
+ raw_spin_lock_irq(&base->lock);
- while (time_after_eq(jiffies, base->clk)) {
+- spin_lock_irq(&base->lock);
++ while (find_expired_timers(base))
++ expire_timers(base);
-@@ -1640,8 +1673,8 @@
- while (levels--)
- expire_timers(base, heads + levels);
- }
+- while (time_after_eq(jiffies, base->clk)) {
+-
+- levels = collect_expired_timers(base, heads);
+- base->clk++;
+-
+- while (levels--)
+- expire_timers(base, heads + levels);
+- }
- base->running_timer = NULL;
- spin_unlock_irq(&base->lock);
+ raw_spin_unlock_irq(&base->lock);
@@ -18300,7 +20347,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
}
/*
-@@ -1651,6 +1684,8 @@
+@@ -1651,6 +1720,8 @@
{
struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
@@ -18309,7 +20356,22 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
__run_timers(base);
if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && base->nohz_active)
__run_timers(this_cpu_ptr(&timer_bases[BASE_DEF]));
-@@ -1836,16 +1871,16 @@
+@@ -1665,12 +1736,12 @@
+
+ hrtimer_run_queues();
+ /* Raise the softirq only if required. */
+- if (time_before(jiffies, base->clk)) {
++ if (time_before(jiffies, base->clk) || !tick_find_expired(base)) {
+ if (!IS_ENABLED(CONFIG_NO_HZ_COMMON) || !base->nohz_active)
+ return;
+ /* CPU is awake, so check the deferrable base. */
+ base++;
+- if (time_before(jiffies, base->clk))
++ if (time_before(jiffies, base->clk) || !tick_find_expired(base))
+ return;
+ }
+ raise_softirq(TIMER_SOFTIRQ);
+@@ -1836,16 +1907,17 @@
* The caller is globally serialized and nobody else
* takes two locks at once, deadlock is not possible.
*/
@@ -18319,6 +20381,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
+ raw_spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
BUG_ON(old_base->running_timer);
++ BUG_ON(old_base->expired_count);
for (i = 0; i < WHEEL_SIZE; i++)
migrate_timer_list(new_base, old_base->vectors + i);
@@ -18330,7 +20393,7 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
put_cpu_ptr(&timer_bases);
}
return 0;
-@@ -1861,8 +1896,11 @@
+@@ -1861,8 +1933,12 @@
for (i = 0; i < NR_BASES; i++) {
base = per_cpu_ptr(&timer_bases[i], cpu);
base->cpu = cpu;
@@ -18340,12 +20403,13 @@ diff -Nur linux-4.9.6.orig/kernel/time/timer.c linux-4.9.6/kernel/time/timer.c
+#ifdef CONFIG_PREEMPT_RT_FULL
+ init_swait_queue_head(&base->wait_for_running_timer);
+#endif
++ base->expired_count = 0;
}
}
-diff -Nur linux-4.9.6.orig/kernel/trace/Kconfig linux-4.9.6/kernel/trace/Kconfig
---- linux-4.9.6.orig/kernel/trace/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/Kconfig 2017-01-28 13:59:10.087662182 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/Kconfig linux-4.9.22/kernel/trace/Kconfig
+--- linux-4.9.22.orig/kernel/trace/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/Kconfig 2017-04-18 17:19:16.702774006 +0200
@@ -182,6 +182,24 @@
enabled. This option and the preempt-off timing option can be
used together or separately.)
@@ -18471,9 +20535,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/Kconfig linux-4.9.6/kernel/trace/Kconfig
config ENABLE_DEFAULT_TRACERS
bool "Trace process context switches and events"
depends on !GENERIC_TRACER
-diff -Nur linux-4.9.6.orig/kernel/trace/latency_hist.c linux-4.9.6/kernel/trace/latency_hist.c
---- linux-4.9.6.orig/kernel/trace/latency_hist.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.9.6/kernel/trace/latency_hist.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/latency_hist.c linux-4.9.22/kernel/trace/latency_hist.c
+--- linux-4.9.22.orig/kernel/trace/latency_hist.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9.22/kernel/trace/latency_hist.c 2017-04-18 17:19:16.702774006 +0200
@@ -0,0 +1,1178 @@
+/*
+ * kernel/trace/latency_hist.c
@@ -19653,9 +21717,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/latency_hist.c linux-4.9.6/kernel/trace/
+}
+
+device_initcall(latency_hist_init);
-diff -Nur linux-4.9.6.orig/kernel/trace/Makefile linux-4.9.6/kernel/trace/Makefile
---- linux-4.9.6.orig/kernel/trace/Makefile 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/Makefile 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/Makefile linux-4.9.22/kernel/trace/Makefile
+--- linux-4.9.22.orig/kernel/trace/Makefile 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/Makefile 2017-04-18 17:19:16.702774006 +0200
@@ -38,6 +38,10 @@
obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o
obj-$(CONFIG_SCHED_TRACER) += trace_sched_wakeup.o
@@ -19667,9 +21731,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/Makefile linux-4.9.6/kernel/trace/Makefi
obj-$(CONFIG_NOP_TRACER) += trace_nop.o
obj-$(CONFIG_STACK_TRACER) += trace_stack.o
obj-$(CONFIG_MMIOTRACE) += trace_mmiotrace.o
-diff -Nur linux-4.9.6.orig/kernel/trace/trace.c linux-4.9.6/kernel/trace/trace.c
---- linux-4.9.6.orig/kernel/trace/trace.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/trace.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/trace.c linux-4.9.22/kernel/trace/trace.c
+--- linux-4.9.22.orig/kernel/trace/trace.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/trace.c 2017-04-18 17:19:16.706774161 +0200
@@ -1897,6 +1897,7 @@
struct task_struct *tsk = current;
@@ -19737,9 +21801,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/trace.c linux-4.9.6/kernel/trace/trace.c
}
void
-diff -Nur linux-4.9.6.orig/kernel/trace/trace_events.c linux-4.9.6/kernel/trace/trace_events.c
---- linux-4.9.6.orig/kernel/trace/trace_events.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/trace_events.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/trace_events.c linux-4.9.22/kernel/trace/trace_events.c
+--- linux-4.9.22.orig/kernel/trace/trace_events.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/trace_events.c 2017-04-18 17:19:16.706774161 +0200
@@ -187,6 +187,8 @@
__common_field(unsigned char, flags);
__common_field(unsigned char, preempt_count);
@@ -19749,9 +21813,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/trace_events.c linux-4.9.6/kernel/trace/
return ret;
}
-diff -Nur linux-4.9.6.orig/kernel/trace/trace.h linux-4.9.6/kernel/trace/trace.h
---- linux-4.9.6.orig/kernel/trace/trace.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/trace.h 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/trace.h linux-4.9.22/kernel/trace/trace.h
+--- linux-4.9.22.orig/kernel/trace/trace.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/trace.h 2017-04-18 17:19:16.706774161 +0200
@@ -124,6 +124,7 @@
* NEED_RESCHED - reschedule is requested
* HARDIRQ - inside an interrupt handler
@@ -19768,9 +21832,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/trace.h linux-4.9.6/kernel/trace/trace.h
};
#define TRACE_BUF_SIZE 1024
-diff -Nur linux-4.9.6.orig/kernel/trace/trace_irqsoff.c linux-4.9.6/kernel/trace/trace_irqsoff.c
---- linux-4.9.6.orig/kernel/trace/trace_irqsoff.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/trace_irqsoff.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/trace_irqsoff.c linux-4.9.22/kernel/trace/trace_irqsoff.c
+--- linux-4.9.22.orig/kernel/trace/trace_irqsoff.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/trace_irqsoff.c 2017-04-18 17:19:16.706774161 +0200
@@ -13,6 +13,7 @@
#include <linux/uaccess.h>
#include <linux/module.h>
@@ -19854,9 +21918,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/trace_irqsoff.c linux-4.9.6/kernel/trace
if (preempt_trace() && !irq_trace())
start_critical_timing(a0, a1);
}
-diff -Nur linux-4.9.6.orig/kernel/trace/trace_output.c linux-4.9.6/kernel/trace/trace_output.c
---- linux-4.9.6.orig/kernel/trace/trace_output.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/trace/trace_output.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/trace/trace_output.c linux-4.9.22/kernel/trace/trace_output.c
+--- linux-4.9.22.orig/kernel/trace/trace_output.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/trace/trace_output.c 2017-04-18 17:19:16.706774161 +0200
@@ -386,6 +386,7 @@
{
char hardsoft_irq;
@@ -19903,9 +21967,9 @@ diff -Nur linux-4.9.6.orig/kernel/trace/trace_output.c linux-4.9.6/kernel/trace/
return !trace_seq_has_overflowed(s);
}
-diff -Nur linux-4.9.6.orig/kernel/user.c linux-4.9.6/kernel/user.c
---- linux-4.9.6.orig/kernel/user.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/user.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/user.c linux-4.9.22/kernel/user.c
+--- linux-4.9.22.orig/kernel/user.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/user.c 2017-04-18 17:19:16.706774161 +0200
@@ -161,11 +161,11 @@
if (!up)
return;
@@ -19920,9 +21984,9 @@ diff -Nur linux-4.9.6.orig/kernel/user.c linux-4.9.6/kernel/user.c
}
struct user_struct *alloc_uid(kuid_t uid)
-diff -Nur linux-4.9.6.orig/kernel/watchdog.c linux-4.9.6/kernel/watchdog.c
---- linux-4.9.6.orig/kernel/watchdog.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/watchdog.c 2017-01-28 13:59:10.091662336 +0100
+diff -Nur linux-4.9.22.orig/kernel/watchdog.c linux-4.9.22/kernel/watchdog.c
+--- linux-4.9.22.orig/kernel/watchdog.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/watchdog.c 2017-04-18 17:19:16.706774161 +0200
@@ -315,6 +315,8 @@
#ifdef CONFIG_HARDLOCKUP_DETECTOR
@@ -19962,9 +22026,9 @@ diff -Nur linux-4.9.6.orig/kernel/watchdog.c linux-4.9.6/kernel/watchdog.c
/* Enable the perf event */
watchdog_nmi_enable(cpu);
-diff -Nur linux-4.9.6.orig/kernel/workqueue.c linux-4.9.6/kernel/workqueue.c
---- linux-4.9.6.orig/kernel/workqueue.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/workqueue.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/kernel/workqueue.c linux-4.9.22/kernel/workqueue.c
+--- linux-4.9.22.orig/kernel/workqueue.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/workqueue.c 2017-04-18 17:19:16.706774161 +0200
@@ -48,6 +48,8 @@
#include <linux/nodemask.h>
#include <linux/moduleparam.h>
@@ -20607,9 +22671,9 @@ diff -Nur linux-4.9.6.orig/kernel/workqueue.c linux-4.9.6/kernel/workqueue.c
return written;
}
-diff -Nur linux-4.9.6.orig/kernel/workqueue_internal.h linux-4.9.6/kernel/workqueue_internal.h
---- linux-4.9.6.orig/kernel/workqueue_internal.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/kernel/workqueue_internal.h 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/kernel/workqueue_internal.h linux-4.9.22/kernel/workqueue_internal.h
+--- linux-4.9.22.orig/kernel/workqueue_internal.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/kernel/workqueue_internal.h 2017-04-18 17:19:16.706774161 +0200
@@ -43,6 +43,7 @@
unsigned long last_active; /* L: last active timestamp */
unsigned int flags; /* X: flags */
@@ -20628,9 +22692,9 @@ diff -Nur linux-4.9.6.orig/kernel/workqueue_internal.h linux-4.9.6/kernel/workqu
+void wq_worker_sleeping(struct task_struct *task);
#endif /* _KERNEL_WORKQUEUE_INTERNAL_H */
-diff -Nur linux-4.9.6.orig/lib/debugobjects.c linux-4.9.6/lib/debugobjects.c
---- linux-4.9.6.orig/lib/debugobjects.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/debugobjects.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/debugobjects.c linux-4.9.22/lib/debugobjects.c
+--- linux-4.9.22.orig/lib/debugobjects.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/debugobjects.c 2017-04-18 17:19:16.706774161 +0200
@@ -308,7 +308,10 @@
struct debug_obj *obj;
unsigned long flags;
@@ -20643,9 +22707,9 @@ diff -Nur linux-4.9.6.orig/lib/debugobjects.c linux-4.9.6/lib/debugobjects.c
db = get_bucket((unsigned long) addr);
-diff -Nur linux-4.9.6.orig/lib/idr.c linux-4.9.6/lib/idr.c
---- linux-4.9.6.orig/lib/idr.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/idr.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/idr.c linux-4.9.22/lib/idr.c
+--- linux-4.9.22.orig/lib/idr.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/idr.c 2017-04-18 17:19:16.706774161 +0200
@@ -30,6 +30,7 @@
#include <linux/idr.h>
#include <linux/spinlock.h>
@@ -20738,9 +22802,9 @@ diff -Nur linux-4.9.6.orig/lib/idr.c linux-4.9.6/lib/idr.c
if (!new)
break;
-diff -Nur linux-4.9.6.orig/lib/irq_poll.c linux-4.9.6/lib/irq_poll.c
---- linux-4.9.6.orig/lib/irq_poll.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/irq_poll.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/irq_poll.c linux-4.9.22/lib/irq_poll.c
+--- linux-4.9.22.orig/lib/irq_poll.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/irq_poll.c 2017-04-18 17:19:16.706774161 +0200
@@ -36,6 +36,7 @@
list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll));
__raise_softirq_irqoff(IRQ_POLL_SOFTIRQ);
@@ -20781,9 +22845,9 @@ diff -Nur linux-4.9.6.orig/lib/irq_poll.c linux-4.9.6/lib/irq_poll.c
return 0;
}
-diff -Nur linux-4.9.6.orig/lib/Kconfig linux-4.9.6/lib/Kconfig
---- linux-4.9.6.orig/lib/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/Kconfig 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/Kconfig linux-4.9.22/lib/Kconfig
+--- linux-4.9.22.orig/lib/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/Kconfig 2017-04-18 17:19:16.706774161 +0200
@@ -400,6 +400,7 @@
config CPUMASK_OFFSTACK
@@ -20792,9 +22856,9 @@ diff -Nur linux-4.9.6.orig/lib/Kconfig linux-4.9.6/lib/Kconfig
help
Use dynamic allocation for cpumask_var_t, instead of putting
them on the stack. This is a bit more expensive, but avoids
-diff -Nur linux-4.9.6.orig/lib/locking-selftest.c linux-4.9.6/lib/locking-selftest.c
---- linux-4.9.6.orig/lib/locking-selftest.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/locking-selftest.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/locking-selftest.c linux-4.9.22/lib/locking-selftest.c
+--- linux-4.9.22.orig/lib/locking-selftest.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/locking-selftest.c 2017-04-18 17:19:16.706774161 +0200
@@ -590,6 +590,8 @@
#include "locking-selftest-spin-hardirq.h"
GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin)
@@ -20943,9 +23007,9 @@ diff -Nur linux-4.9.6.orig/lib/locking-selftest.c linux-4.9.6/lib/locking-selfte
ww_tests();
-diff -Nur linux-4.9.6.orig/lib/percpu_ida.c linux-4.9.6/lib/percpu_ida.c
---- linux-4.9.6.orig/lib/percpu_ida.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/percpu_ida.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/percpu_ida.c linux-4.9.22/lib/percpu_ida.c
+--- linux-4.9.22.orig/lib/percpu_ida.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/percpu_ida.c 2017-04-18 17:19:16.706774161 +0200
@@ -26,6 +26,9 @@
#include <linux/string.h>
#include <linux/spinlock.h>
@@ -21034,44 +23098,94 @@ diff -Nur linux-4.9.6.orig/lib/percpu_ida.c linux-4.9.6/lib/percpu_ida.c
return err;
}
EXPORT_SYMBOL_GPL(percpu_ida_for_each_free);
-diff -Nur linux-4.9.6.orig/lib/radix-tree.c linux-4.9.6/lib/radix-tree.c
---- linux-4.9.6.orig/lib/radix-tree.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/radix-tree.c 2017-01-28 13:59:10.095662491 +0100
-@@ -290,13 +290,14 @@
+diff -Nur linux-4.9.22.orig/lib/radix-tree.c linux-4.9.22/lib/radix-tree.c
+--- linux-4.9.22.orig/lib/radix-tree.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/radix-tree.c 2017-04-18 17:19:16.710774317 +0200
+@@ -36,7 +36,7 @@
+ #include <linux/bitops.h>
+ #include <linux/rcupdate.h>
+ #include <linux/preempt.h> /* in_interrupt() */
+-
++#include <linux/locallock.h>
+
+ /* Number of nodes in fully populated tree of given height */
+ static unsigned long height_to_maxnodes[RADIX_TREE_MAX_PATH + 1] __read_mostly;
+@@ -68,6 +68,7 @@
+ struct radix_tree_node *nodes;
+ };
+ static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, };
++static DEFINE_LOCAL_IRQ_LOCK(radix_tree_preloads_lock);
+
+ static inline void *node_to_entry(void *ptr)
+ {
+@@ -290,13 +291,14 @@
* succeed in getting a node here (and never reach
* kmem_cache_alloc)
*/
- rtp = this_cpu_ptr(&radix_tree_preloads);
-+ rtp = &get_cpu_var(radix_tree_preloads);
++ rtp = &get_locked_var(radix_tree_preloads_lock, radix_tree_preloads);
if (rtp->nr) {
ret = rtp->nodes;
rtp->nodes = ret->private_data;
ret->private_data = NULL;
rtp->nr--;
}
-+ put_cpu_var(radix_tree_preloads);
++ put_locked_var(radix_tree_preloads_lock, radix_tree_preloads);
/*
* Update the allocation stack trace as this is more useful
* for debugging.
-@@ -336,6 +337,7 @@
- call_rcu(&node->rcu_head, radix_tree_node_rcu_free);
+@@ -357,14 +359,14 @@
+ */
+ gfp_mask &= ~__GFP_ACCOUNT;
+
+- preempt_disable();
++ local_lock(radix_tree_preloads_lock);
+ rtp = this_cpu_ptr(&radix_tree_preloads);
+ while (rtp->nr < nr) {
+- preempt_enable();
++ local_unlock(radix_tree_preloads_lock);
+ node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
+ if (node == NULL)
+ goto out;
+- preempt_disable();
++ local_lock(radix_tree_preloads_lock);
+ rtp = this_cpu_ptr(&radix_tree_preloads);
+ if (rtp->nr < nr) {
+ node->private_data = rtp->nodes;
+@@ -406,7 +408,7 @@
+ if (gfpflags_allow_blocking(gfp_mask))
+ return __radix_tree_preload(gfp_mask, RADIX_TREE_PRELOAD_SIZE);
+ /* Preloading doesn't help anything with this gfp mask, skip it */
+- preempt_disable();
++ local_lock(radix_tree_preloads_lock);
+ return 0;
}
+ EXPORT_SYMBOL(radix_tree_maybe_preload);
+@@ -422,7 +424,7 @@
-+#ifndef CONFIG_PREEMPT_RT_FULL
- /*
- * Load up this CPU's radix_tree_node buffer with sufficient objects to
- * ensure that the addition of a single element in the tree cannot fail. On
-@@ -455,6 +457,7 @@
+ /* Preloading doesn't help anything with this gfp mask, skip it */
+ if (!gfpflags_allow_blocking(gfp_mask)) {
+- preempt_disable();
++ local_lock(radix_tree_preloads_lock);
+ return 0;
+ }
+@@ -456,6 +458,12 @@
return __radix_tree_preload(gfp_mask, nr_nodes);
}
-+#endif
++void radix_tree_preload_end(void)
++{
++ local_unlock(radix_tree_preloads_lock);
++}
++EXPORT_SYMBOL(radix_tree_preload_end);
++
/*
* The maximum index which can be stored in a radix tree
-diff -Nur linux-4.9.6.orig/lib/scatterlist.c linux-4.9.6/lib/scatterlist.c
---- linux-4.9.6.orig/lib/scatterlist.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/scatterlist.c 2017-01-28 13:59:10.095662491 +0100
+ */
+diff -Nur linux-4.9.22.orig/lib/scatterlist.c linux-4.9.22/lib/scatterlist.c
+--- linux-4.9.22.orig/lib/scatterlist.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/scatterlist.c 2017-04-18 17:19:16.710774317 +0200
@@ -620,7 +620,7 @@
flush_kernel_dcache_page(miter->page);
@@ -21099,9 +23213,9 @@ diff -Nur linux-4.9.6.orig/lib/scatterlist.c linux-4.9.6/lib/scatterlist.c
return offset;
}
EXPORT_SYMBOL(sg_copy_buffer);
-diff -Nur linux-4.9.6.orig/lib/smp_processor_id.c linux-4.9.6/lib/smp_processor_id.c
---- linux-4.9.6.orig/lib/smp_processor_id.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/lib/smp_processor_id.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/lib/smp_processor_id.c linux-4.9.22/lib/smp_processor_id.c
+--- linux-4.9.22.orig/lib/smp_processor_id.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/lib/smp_processor_id.c 2017-04-18 17:19:16.710774317 +0200
@@ -39,8 +39,9 @@
if (!printk_ratelimit())
goto out_enable;
@@ -21114,9 +23228,9 @@ diff -Nur linux-4.9.6.orig/lib/smp_processor_id.c linux-4.9.6/lib/smp_processor_
print_symbol("caller is %s\n", (long)__builtin_return_address(0));
dump_stack();
-diff -Nur linux-4.9.6.orig/mm/backing-dev.c linux-4.9.6/mm/backing-dev.c
---- linux-4.9.6.orig/mm/backing-dev.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/backing-dev.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/mm/backing-dev.c linux-4.9.22/mm/backing-dev.c
+--- linux-4.9.22.orig/mm/backing-dev.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/backing-dev.c 2017-04-18 17:19:16.710774317 +0200
@@ -457,9 +457,9 @@
{
unsigned long flags;
@@ -21129,9 +23243,9 @@ diff -Nur linux-4.9.6.orig/mm/backing-dev.c linux-4.9.6/mm/backing-dev.c
return;
}
-diff -Nur linux-4.9.6.orig/mm/compaction.c linux-4.9.6/mm/compaction.c
---- linux-4.9.6.orig/mm/compaction.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/compaction.c 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/mm/compaction.c linux-4.9.22/mm/compaction.c
+--- linux-4.9.22.orig/mm/compaction.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/compaction.c 2017-04-18 17:19:16.710774317 +0200
@@ -1593,10 +1593,12 @@
block_start_pfn(cc->migrate_pfn, cc->order);
@@ -21147,9 +23261,9 @@ diff -Nur linux-4.9.6.orig/mm/compaction.c linux-4.9.6/mm/compaction.c
/* No more flushing until we migrate again */
cc->last_migrated_pfn = 0;
}
-diff -Nur linux-4.9.6.orig/mm/filemap.c linux-4.9.6/mm/filemap.c
---- linux-4.9.6.orig/mm/filemap.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/filemap.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/filemap.c linux-4.9.22/mm/filemap.c
+--- linux-4.9.22.orig/mm/filemap.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/filemap.c 2017-04-18 17:19:16.710774317 +0200
@@ -159,9 +159,12 @@
* node->private_list is protected by
* mapping->tree_lock.
@@ -21178,9 +23292,9 @@ diff -Nur linux-4.9.6.orig/mm/filemap.c linux-4.9.6/mm/filemap.c
}
}
-diff -Nur linux-4.9.6.orig/mm/highmem.c linux-4.9.6/mm/highmem.c
---- linux-4.9.6.orig/mm/highmem.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/highmem.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/highmem.c linux-4.9.22/mm/highmem.c
+--- linux-4.9.22.orig/mm/highmem.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/highmem.c 2017-04-18 17:19:16.710774317 +0200
@@ -29,10 +29,11 @@
#include <linux/kgdb.h>
#include <asm/tlbflush.h>
@@ -21205,9 +23319,9 @@ diff -Nur linux-4.9.6.orig/mm/highmem.c linux-4.9.6/mm/highmem.c
unsigned int nr_free_highpages (void)
{
-diff -Nur linux-4.9.6.orig/mm/Kconfig linux-4.9.6/mm/Kconfig
---- linux-4.9.6.orig/mm/Kconfig 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/Kconfig 2017-01-28 13:59:10.095662491 +0100
+diff -Nur linux-4.9.22.orig/mm/Kconfig linux-4.9.22/mm/Kconfig
+--- linux-4.9.22.orig/mm/Kconfig 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/Kconfig 2017-04-18 17:19:16.710774317 +0200
@@ -410,7 +410,7 @@
config TRANSPARENT_HUGEPAGE
@@ -21217,9 +23331,9 @@ diff -Nur linux-4.9.6.orig/mm/Kconfig linux-4.9.6/mm/Kconfig
select COMPACTION
select RADIX_TREE_MULTIORDER
help
-diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
---- linux-4.9.6.orig/mm/memcontrol.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/memcontrol.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/memcontrol.c linux-4.9.22/mm/memcontrol.c
+--- linux-4.9.22.orig/mm/memcontrol.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/memcontrol.c 2017-04-18 17:19:16.710774317 +0200
@@ -67,6 +67,7 @@
#include <net/sock.h>
#include <net/ip.h>
@@ -21315,7 +23429,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
put_online_cpus();
mutex_unlock(&percpu_charge_mutex);
}
-@@ -4548,12 +4552,12 @@
+@@ -4553,12 +4557,12 @@
ret = 0;
@@ -21330,7 +23444,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
out_unlock:
unlock_page(page);
out:
-@@ -5428,10 +5432,10 @@
+@@ -5433,10 +5437,10 @@
commit_charge(page, memcg, lrucare);
@@ -21343,7 +23457,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
if (do_memsw_account() && PageSwapCache(page)) {
swp_entry_t entry = { .val = page_private(page) };
-@@ -5487,14 +5491,14 @@
+@@ -5492,14 +5496,14 @@
memcg_oom_recover(memcg);
}
@@ -21360,7 +23474,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
if (!mem_cgroup_is_root(memcg))
css_put_many(&memcg->css, nr_pages);
-@@ -5649,10 +5653,10 @@
+@@ -5654,10 +5658,10 @@
commit_charge(newpage, memcg, false);
@@ -21373,7 +23487,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
}
DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key);
-@@ -5832,6 +5836,7 @@
+@@ -5837,6 +5841,7 @@
{
struct mem_cgroup *memcg, *swap_memcg;
unsigned short oldid;
@@ -21381,7 +23495,7 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
VM_BUG_ON_PAGE(PageLRU(page), page);
VM_BUG_ON_PAGE(page_count(page), page);
-@@ -5872,12 +5877,16 @@
+@@ -5877,12 +5882,16 @@
* important here to have the interrupts disabled because it is the
* only synchronisation we have for udpating the per-CPU variables.
*/
@@ -21398,9 +23512,9 @@ diff -Nur linux-4.9.6.orig/mm/memcontrol.c linux-4.9.6/mm/memcontrol.c
}
/*
-diff -Nur linux-4.9.6.orig/mm/mmu_context.c linux-4.9.6/mm/mmu_context.c
---- linux-4.9.6.orig/mm/mmu_context.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/mmu_context.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/mmu_context.c linux-4.9.22/mm/mmu_context.c
+--- linux-4.9.22.orig/mm/mmu_context.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/mmu_context.c 2017-04-18 17:19:16.710774317 +0200
@@ -23,6 +23,7 @@
struct task_struct *tsk = current;
@@ -21417,9 +23531,9 @@ diff -Nur linux-4.9.6.orig/mm/mmu_context.c linux-4.9.6/mm/mmu_context.c
task_unlock(tsk);
#ifdef finish_arch_post_lock_switch
finish_arch_post_lock_switch();
-diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
---- linux-4.9.6.orig/mm/page_alloc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/page_alloc.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/page_alloc.c linux-4.9.22/mm/page_alloc.c
+--- linux-4.9.22.orig/mm/page_alloc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/page_alloc.c 2017-04-18 17:19:16.710774317 +0200
@@ -61,6 +61,7 @@
#include <linux/page_ext.h>
#include <linux/hugetlb.h>
@@ -21732,7 +23846,7 @@ diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
return NULL;
}
-@@ -6505,7 +6567,9 @@
+@@ -6531,7 +6593,9 @@
int cpu = (unsigned long)hcpu;
if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
@@ -21742,7 +23856,7 @@ diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
drain_pages(cpu);
/*
-@@ -6531,6 +6595,7 @@
+@@ -6557,6 +6621,7 @@
void __init page_alloc_init(void)
{
hotcpu_notifier(page_alloc_cpu_notify, 0);
@@ -21750,7 +23864,7 @@ diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
}
/*
-@@ -7359,7 +7424,7 @@
+@@ -7385,7 +7450,7 @@
struct per_cpu_pageset *pset;
/* avoid races with drain_pages() */
@@ -21759,7 +23873,7 @@ diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
if (zone->pageset != &boot_pageset) {
for_each_online_cpu(cpu) {
pset = per_cpu_ptr(zone->pageset, cpu);
-@@ -7368,7 +7433,7 @@
+@@ -7394,7 +7459,7 @@
free_percpu(zone->pageset);
zone->pageset = &boot_pageset;
}
@@ -21768,9 +23882,74 @@ diff -Nur linux-4.9.6.orig/mm/page_alloc.c linux-4.9.6/mm/page_alloc.c
}
#ifdef CONFIG_MEMORY_HOTREMOVE
-diff -Nur linux-4.9.6.orig/mm/slab.h linux-4.9.6/mm/slab.h
---- linux-4.9.6.orig/mm/slab.h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/slab.h 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/percpu.c linux-4.9.22/mm/percpu.c
+--- linux-4.9.22.orig/mm/percpu.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/percpu.c 2017-04-18 17:19:16.714774471 +0200
+@@ -1283,18 +1283,7 @@
+ }
+ EXPORT_SYMBOL_GPL(free_percpu);
+
+-/**
+- * is_kernel_percpu_address - test whether address is from static percpu area
+- * @addr: address to test
+- *
+- * Test whether @addr belongs to in-kernel static percpu area. Module
+- * static percpu areas are not considered. For those, use
+- * is_module_percpu_address().
+- *
+- * RETURNS:
+- * %true if @addr is from in-kernel static percpu area, %false otherwise.
+- */
+-bool is_kernel_percpu_address(unsigned long addr)
++bool __is_kernel_percpu_address(unsigned long addr, unsigned long *can_addr)
+ {
+ #ifdef CONFIG_SMP
+ const size_t static_size = __per_cpu_end - __per_cpu_start;
+@@ -1303,16 +1292,39 @@
+
+ for_each_possible_cpu(cpu) {
+ void *start = per_cpu_ptr(base, cpu);
++ void *va = (void *)addr;
+
+- if ((void *)addr >= start && (void *)addr < start + static_size)
++ if (va >= start && va < start + static_size) {
++ if (can_addr) {
++ *can_addr = (unsigned long) (va - start);
++ *can_addr += (unsigned long)
++ per_cpu_ptr(base, get_boot_cpu_id());
++ }
+ return true;
+- }
++ }
++ }
+ #endif
+ /* on UP, can't distinguish from other static vars, always false */
+ return false;
+ }
+
+ /**
++ * is_kernel_percpu_address - test whether address is from static percpu area
++ * @addr: address to test
++ *
++ * Test whether @addr belongs to in-kernel static percpu area. Module
++ * static percpu areas are not considered. For those, use
++ * is_module_percpu_address().
++ *
++ * RETURNS:
++ * %true if @addr is from in-kernel static percpu area, %false otherwise.
++ */
++bool is_kernel_percpu_address(unsigned long addr)
++{
++ return __is_kernel_percpu_address(addr, NULL);
++}
++
++/**
+ * per_cpu_ptr_to_phys - convert translated percpu address to physical address
+ * @addr: the address to be converted to physical address
+ *
+diff -Nur linux-4.9.22.orig/mm/slab.h linux-4.9.22/mm/slab.h
+--- linux-4.9.22.orig/mm/slab.h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/slab.h 2017-04-18 17:19:16.714774471 +0200
@@ -426,7 +426,11 @@
* The slab lists for all objects.
*/
@@ -21783,9 +23962,9 @@ diff -Nur linux-4.9.6.orig/mm/slab.h linux-4.9.6/mm/slab.h
#ifdef CONFIG_SLAB
struct list_head slabs_partial; /* partial list first, better asm code */
-diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
---- linux-4.9.6.orig/mm/slub.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/slub.c 2017-01-28 13:59:10.099662644 +0100
+diff -Nur linux-4.9.22.orig/mm/slub.c linux-4.9.22/mm/slub.c
+--- linux-4.9.22.orig/mm/slub.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/slub.c 2017-04-18 17:19:16.714774471 +0200
@@ -1141,7 +1141,7 @@
unsigned long uninitialized_var(flags);
int ret = 0;
@@ -21817,7 +23996,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
/*
* Hooks for other subsystems that check memory allocations. In a typical
* production configuration these hooks all should produce no code at all.
-@@ -1523,10 +1529,17 @@
+@@ -1527,10 +1533,17 @@
void *start, *p;
int idx, order;
bool shuffle;
@@ -21835,7 +24014,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
local_irq_enable();
flags |= s->allocflags;
-@@ -1601,7 +1614,7 @@
+@@ -1605,7 +1618,7 @@
page->frozen = 1;
out:
@@ -21844,7 +24023,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
local_irq_disable();
if (!page)
return NULL;
-@@ -1660,6 +1673,16 @@
+@@ -1664,6 +1677,16 @@
__free_pages(page, order);
}
@@ -21861,7 +24040,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
#define need_reserve_slab_rcu \
(sizeof(((struct page *)NULL)->lru) < sizeof(struct rcu_head))
-@@ -1691,6 +1714,12 @@
+@@ -1695,6 +1718,12 @@
}
call_rcu(head, rcu_free_slab);
@@ -21874,7 +24053,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
} else
__free_slab(s, page);
}
-@@ -1798,7 +1827,7 @@
+@@ -1802,7 +1831,7 @@
if (!n || !n->nr_partial)
return NULL;
@@ -21883,7 +24062,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
list_for_each_entry_safe(page, page2, &n->partial, lru) {
void *t;
-@@ -1823,7 +1852,7 @@
+@@ -1827,7 +1856,7 @@
break;
}
@@ -21892,7 +24071,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return object;
}
-@@ -2069,7 +2098,7 @@
+@@ -2073,7 +2102,7 @@
* that acquire_slab() will see a slab page that
* is frozen
*/
@@ -21901,7 +24080,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
} else {
m = M_FULL;
-@@ -2080,7 +2109,7 @@
+@@ -2084,7 +2113,7 @@
* slabs from diagnostic functions will not see
* any frozen slabs.
*/
@@ -21910,7 +24089,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
}
-@@ -2115,7 +2144,7 @@
+@@ -2119,7 +2148,7 @@
goto redo;
if (lock)
@@ -21919,7 +24098,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
if (m == M_FREE) {
stat(s, DEACTIVATE_EMPTY);
-@@ -2147,10 +2176,10 @@
+@@ -2151,10 +2180,10 @@
n2 = get_node(s, page_to_nid(page));
if (n != n2) {
if (n)
@@ -21932,7 +24111,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
do {
-@@ -2179,7 +2208,7 @@
+@@ -2183,7 +2212,7 @@
}
if (n)
@@ -21941,7 +24120,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
while (discard_page) {
page = discard_page;
-@@ -2218,14 +2247,21 @@
+@@ -2222,14 +2251,21 @@
pobjects = oldpage->pobjects;
pages = oldpage->pages;
if (drain && pobjects > s->cpu_partial) {
@@ -21963,7 +24142,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
oldpage = NULL;
pobjects = 0;
pages = 0;
-@@ -2297,7 +2333,22 @@
+@@ -2301,7 +2337,22 @@
static void flush_all(struct kmem_cache *s)
{
@@ -21986,7 +24165,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
/*
-@@ -2352,10 +2403,10 @@
+@@ -2356,10 +2407,10 @@
unsigned long x = 0;
struct page *page;
@@ -21999,7 +24178,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return x;
}
#endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */
-@@ -2493,8 +2544,10 @@
+@@ -2497,8 +2548,10 @@
* already disabled (which is the case for bulk allocation).
*/
static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
@@ -22011,7 +24190,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
void *freelist;
struct page *page;
-@@ -2554,6 +2607,13 @@
+@@ -2558,6 +2611,13 @@
VM_BUG_ON(!c->page->frozen);
c->freelist = get_freepointer(s, freelist);
c->tid = next_tid(c->tid);
@@ -22025,7 +24204,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return freelist;
new_slab:
-@@ -2585,7 +2645,7 @@
+@@ -2589,7 +2649,7 @@
deactivate_slab(s, page, get_freepointer(s, freelist));
c->page = NULL;
c->freelist = NULL;
@@ -22034,7 +24213,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
/*
-@@ -2597,6 +2657,7 @@
+@@ -2601,6 +2661,7 @@
{
void *p;
unsigned long flags;
@@ -22042,7 +24221,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
local_irq_save(flags);
#ifdef CONFIG_PREEMPT
-@@ -2608,8 +2669,9 @@
+@@ -2612,8 +2673,9 @@
c = this_cpu_ptr(s->cpu_slab);
#endif
@@ -22053,7 +24232,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return p;
}
-@@ -2795,7 +2857,7 @@
+@@ -2799,7 +2861,7 @@
do {
if (unlikely(n)) {
@@ -22062,7 +24241,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
n = NULL;
}
prior = page->freelist;
-@@ -2827,7 +2889,7 @@
+@@ -2831,7 +2893,7 @@
* Otherwise the list_lock will synchronize with
* other processors updating the list of slabs.
*/
@@ -22071,7 +24250,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
}
-@@ -2869,7 +2931,7 @@
+@@ -2873,7 +2935,7 @@
add_partial(n, page, DEACTIVATE_TO_TAIL);
stat(s, FREE_ADD_PARTIAL);
}
@@ -22080,7 +24259,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return;
slab_empty:
-@@ -2884,7 +2946,7 @@
+@@ -2888,7 +2950,7 @@
remove_full(s, n, page);
}
@@ -22089,7 +24268,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
stat(s, FREE_SLAB);
discard_slab(s, page);
}
-@@ -3089,6 +3151,7 @@
+@@ -3093,6 +3155,7 @@
void **p)
{
struct kmem_cache_cpu *c;
@@ -22097,7 +24276,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
int i;
/* memcg and kmem_cache debug support */
-@@ -3112,7 +3175,7 @@
+@@ -3116,7 +3179,7 @@
* of re-populating per CPU c->freelist
*/
p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE,
@@ -22106,7 +24285,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
if (unlikely(!p[i]))
goto error;
-@@ -3124,6 +3187,7 @@
+@@ -3128,6 +3191,7 @@
}
c->tid = next_tid(c->tid);
local_irq_enable();
@@ -22114,7 +24293,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
/* Clear memory outside IRQ disabled fastpath loop */
if (unlikely(flags & __GFP_ZERO)) {
-@@ -3271,7 +3335,7 @@
+@@ -3275,7 +3339,7 @@
init_kmem_cache_node(struct kmem_cache_node *n)
{
n->nr_partial = 0;
@@ -22123,7 +24302,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
INIT_LIST_HEAD(&n->partial);
#ifdef CONFIG_SLUB_DEBUG
atomic_long_set(&n->nr_slabs, 0);
-@@ -3615,6 +3679,10 @@
+@@ -3619,6 +3683,10 @@
const char *text)
{
#ifdef CONFIG_SLUB_DEBUG
@@ -22134,7 +24313,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
void *addr = page_address(page);
void *p;
unsigned long *map = kzalloc(BITS_TO_LONGS(page->objects) *
-@@ -3635,6 +3703,7 @@
+@@ -3639,6 +3707,7 @@
slab_unlock(page);
kfree(map);
#endif
@@ -22142,7 +24321,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
/*
-@@ -3648,7 +3717,7 @@
+@@ -3652,7 +3721,7 @@
struct page *page, *h;
BUG_ON(irqs_disabled());
@@ -22151,7 +24330,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
list_for_each_entry_safe(page, h, &n->partial, lru) {
if (!page->inuse) {
remove_partial(n, page);
-@@ -3658,7 +3727,7 @@
+@@ -3662,7 +3731,7 @@
"Objects remaining in %s on __kmem_cache_shutdown()");
}
}
@@ -22160,7 +24339,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
list_for_each_entry_safe(page, h, &discard, lru)
discard_slab(s, page);
-@@ -3916,7 +3985,7 @@
+@@ -3905,7 +3974,7 @@
for (i = 0; i < SHRINK_PROMOTE_MAX; i++)
INIT_LIST_HEAD(promote + i);
@@ -22169,7 +24348,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
/*
* Build lists of slabs to discard or promote.
-@@ -3947,7 +4016,7 @@
+@@ -3936,7 +4005,7 @@
for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--)
list_splice(promote + i, &n->partial);
@@ -22178,7 +24357,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
/* Release empty slabs */
list_for_each_entry_safe(page, t, &discard, lru)
-@@ -4123,6 +4192,12 @@
+@@ -4112,6 +4181,12 @@
{
static __initdata struct kmem_cache boot_kmem_cache,
boot_kmem_cache_node;
@@ -22191,7 +24370,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
if (debug_guardpage_minorder())
slub_max_order = 0;
-@@ -4331,7 +4406,7 @@
+@@ -4320,7 +4395,7 @@
struct page *page;
unsigned long flags;
@@ -22200,7 +24379,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
list_for_each_entry(page, &n->partial, lru) {
validate_slab_slab(s, page, map);
-@@ -4353,7 +4428,7 @@
+@@ -4342,7 +4417,7 @@
s->name, count, atomic_long_read(&n->nr_slabs));
out:
@@ -22209,7 +24388,7 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
return count;
}
-@@ -4541,12 +4616,12 @@
+@@ -4530,12 +4605,12 @@
if (!atomic_long_read(&n->nr_slabs))
continue;
@@ -22224,9 +24403,9 @@ diff -Nur linux-4.9.6.orig/mm/slub.c linux-4.9.6/mm/slub.c
}
for (i = 0; i < t.count; i++) {
-diff -Nur linux-4.9.6.orig/mm/swap.c linux-4.9.6/mm/swap.c
---- linux-4.9.6.orig/mm/swap.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/swap.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/swap.c linux-4.9.22/mm/swap.c
+--- linux-4.9.22.orig/mm/swap.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/swap.c 2017-04-18 17:19:16.714774471 +0200
@@ -32,6 +32,7 @@
#include <linux/memcontrol.h>
#include <linux/gfp.h>
@@ -22428,9 +24607,9 @@ diff -Nur linux-4.9.6.orig/mm/swap.c linux-4.9.6/mm/swap.c
put_online_cpus();
mutex_unlock(&lock);
-diff -Nur linux-4.9.6.orig/mm/truncate.c linux-4.9.6/mm/truncate.c
---- linux-4.9.6.orig/mm/truncate.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/truncate.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/truncate.c linux-4.9.22/mm/truncate.c
+--- linux-4.9.22.orig/mm/truncate.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/truncate.c 2017-04-18 17:19:16.714774471 +0200
@@ -62,9 +62,12 @@
* protected by mapping->tree_lock.
*/
@@ -22446,9 +24625,9 @@ diff -Nur linux-4.9.6.orig/mm/truncate.c linux-4.9.6/mm/truncate.c
__radix_tree_delete_node(&mapping->page_tree, node);
unlock:
spin_unlock_irq(&mapping->tree_lock);
-diff -Nur linux-4.9.6.orig/mm/vmalloc.c linux-4.9.6/mm/vmalloc.c
---- linux-4.9.6.orig/mm/vmalloc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/vmalloc.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/vmalloc.c linux-4.9.22/mm/vmalloc.c
+--- linux-4.9.22.orig/mm/vmalloc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/vmalloc.c 2017-04-18 17:19:16.714774471 +0200
@@ -845,7 +845,7 @@
struct vmap_block *vb;
struct vmap_area *va;
@@ -22500,9 +24679,9 @@ diff -Nur linux-4.9.6.orig/mm/vmalloc.c linux-4.9.6/mm/vmalloc.c
rcu_read_unlock();
/* Allocate new block if nothing was found */
-diff -Nur linux-4.9.6.orig/mm/vmstat.c linux-4.9.6/mm/vmstat.c
---- linux-4.9.6.orig/mm/vmstat.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/vmstat.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/vmstat.c linux-4.9.22/mm/vmstat.c
+--- linux-4.9.22.orig/mm/vmstat.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/vmstat.c 2017-04-18 17:19:16.714774471 +0200
@@ -245,6 +245,7 @@
long x;
long t;
@@ -22599,9 +24778,9 @@ diff -Nur linux-4.9.6.orig/mm/vmstat.c linux-4.9.6/mm/vmstat.c
}
void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
-diff -Nur linux-4.9.6.orig/mm/workingset.c linux-4.9.6/mm/workingset.c
---- linux-4.9.6.orig/mm/workingset.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/workingset.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/workingset.c linux-4.9.22/mm/workingset.c
+--- linux-4.9.22.orig/mm/workingset.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/workingset.c 2017-04-18 17:20:59.078743513 +0200
@@ -334,7 +334,8 @@
* point where they would still be useful.
*/
@@ -22655,8 +24834,8 @@ diff -Nur linux-4.9.6.orig/mm/workingset.c linux-4.9.6/mm/workingset.c
pr_info("workingset: timestamp_bits=%d max_order=%d bucket_order=%u\n",
timestamp_bits, max_order, bucket_order);
-- ret = list_lru_init_key(&workingset_shadow_nodes, &shadow_nodes_key);
-+ ret = list_lru_init_key(&__workingset_shadow_nodes, &shadow_nodes_key);
+- ret = __list_lru_init(&workingset_shadow_nodes, true, &shadow_nodes_key);
++ ret = __list_lru_init(&__workingset_shadow_nodes, true, &shadow_nodes_key);
if (ret)
goto err;
ret = register_shrinker(&workingset_shadow_shrinker);
@@ -22669,9 +24848,9 @@ diff -Nur linux-4.9.6.orig/mm/workingset.c linux-4.9.6/mm/workingset.c
err:
return ret;
}
-diff -Nur linux-4.9.6.orig/mm/zsmalloc.c linux-4.9.6/mm/zsmalloc.c
---- linux-4.9.6.orig/mm/zsmalloc.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/mm/zsmalloc.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/mm/zsmalloc.c linux-4.9.22/mm/zsmalloc.c
+--- linux-4.9.22.orig/mm/zsmalloc.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/mm/zsmalloc.c 2017-04-18 17:19:16.714774471 +0200
@@ -53,6 +53,7 @@
#include <linux/mount.h>
#include <linux/migrate.h>
@@ -22849,9 +25028,9 @@ diff -Nur linux-4.9.6.orig/mm/zsmalloc.c linux-4.9.6/mm/zsmalloc.c
migrate_read_unlock(zspage);
unpin_tag(handle);
-diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
---- linux-4.9.6.orig/net/core/dev.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/dev.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/net/core/dev.c linux-4.9.22/net/core/dev.c
+--- linux-4.9.22.orig/net/core/dev.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/dev.c 2017-04-18 17:19:16.718774627 +0200
@@ -190,6 +190,7 @@
static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8);
@@ -22952,7 +25131,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
/**
-@@ -2263,6 +2269,7 @@
+@@ -2285,6 +2291,7 @@
sd->output_queue_tailp = &q->next_sched;
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_restore(flags);
@@ -22960,7 +25139,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
void __netif_schedule(struct Qdisc *q)
-@@ -2344,6 +2351,7 @@
+@@ -2366,6 +2373,7 @@
__this_cpu_write(softnet_data.completion_queue, skb);
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_restore(flags);
@@ -22968,7 +25147,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
EXPORT_SYMBOL(__dev_kfree_skb_irq);
-@@ -3078,7 +3086,11 @@
+@@ -3100,7 +3108,11 @@
* This permits qdisc->running owner to get the lock more
* often and dequeue packets faster.
*/
@@ -22980,7 +25159,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
if (unlikely(contended))
spin_lock(&q->busylock);
-@@ -3141,8 +3153,10 @@
+@@ -3163,8 +3175,10 @@
#define skb_update_prio(skb)
#endif
@@ -22991,7 +25170,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
/**
* dev_loopback_xmit - loop back @skb
-@@ -3376,8 +3390,7 @@
+@@ -3398,8 +3412,7 @@
int cpu = smp_processor_id(); /* ok because BHs are off */
if (txq->xmit_lock_owner != cpu) {
@@ -23001,7 +25180,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
goto recursion_alert;
skb = validate_xmit_skb(skb, dev);
-@@ -3387,9 +3400,9 @@
+@@ -3409,9 +3422,9 @@
HARD_TX_LOCK(dev, txq, cpu);
if (!netif_xmit_stopped(txq)) {
@@ -23013,7 +25192,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
if (dev_xmit_complete(rc)) {
HARD_TX_UNLOCK(dev, txq);
goto out;
-@@ -3763,6 +3776,7 @@
+@@ -3785,6 +3798,7 @@
rps_unlock(sd);
local_irq_restore(flags);
@@ -23021,7 +25200,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
atomic_long_inc(&skb->dev->rx_dropped);
kfree_skb(skb);
-@@ -3781,7 +3795,7 @@
+@@ -3803,7 +3817,7 @@
struct rps_dev_flow voidflow, *rflow = &voidflow;
int cpu;
@@ -23030,7 +25209,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
rcu_read_lock();
cpu = get_rps_cpu(skb->dev, skb, &rflow);
-@@ -3791,13 +3805,13 @@
+@@ -3813,13 +3827,13 @@
ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
rcu_read_unlock();
@@ -23047,7 +25226,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
return ret;
}
-@@ -3831,11 +3845,9 @@
+@@ -3853,11 +3867,9 @@
trace_netif_rx_ni_entry(skb);
@@ -23061,7 +25240,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
return err;
}
-@@ -4314,7 +4326,7 @@
+@@ -4336,7 +4348,7 @@
skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
__skb_unlink(skb, &sd->input_pkt_queue);
@@ -23070,7 +25249,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
input_queue_head_incr(sd);
}
}
-@@ -4324,11 +4336,14 @@
+@@ -4346,11 +4358,14 @@
skb_queue_walk_safe(&sd->process_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
__skb_unlink(skb, &sd->process_queue);
@@ -23086,7 +25265,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
static void flush_all_backlogs(void)
-@@ -4809,6 +4824,7 @@
+@@ -4831,6 +4846,7 @@
sd->rps_ipi_list = NULL;
local_irq_enable();
@@ -23094,7 +25273,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
/* Send pending IPI's to kick RPS processing on remote cpus. */
while (remsd) {
-@@ -4822,6 +4838,7 @@
+@@ -4844,6 +4860,7 @@
} else
#endif
local_irq_enable();
@@ -23102,7 +25281,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
}
static bool sd_has_rps_ipi_waiting(struct softnet_data *sd)
-@@ -4851,7 +4868,9 @@
+@@ -4873,7 +4890,9 @@
while (again) {
struct sk_buff *skb;
@@ -23112,7 +25291,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
rcu_read_lock();
__netif_receive_skb(skb);
rcu_read_unlock();
-@@ -4859,9 +4878,9 @@
+@@ -4881,9 +4900,9 @@
if (++work >= quota)
return work;
@@ -23123,7 +25302,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
rps_lock(sd);
if (skb_queue_empty(&sd->input_pkt_queue)) {
/*
-@@ -4899,9 +4918,11 @@
+@@ -4921,9 +4940,11 @@
local_irq_save(flags);
____napi_schedule(this_cpu_ptr(&softnet_data), n);
local_irq_restore(flags);
@@ -23135,7 +25314,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
/**
* __napi_schedule_irqoff - schedule for receive
* @n: entry to schedule
-@@ -4913,6 +4934,7 @@
+@@ -4935,6 +4956,7 @@
____napi_schedule(this_cpu_ptr(&softnet_data), n);
}
EXPORT_SYMBOL(__napi_schedule_irqoff);
@@ -23143,7 +25322,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
void __napi_complete(struct napi_struct *n)
{
-@@ -5202,13 +5224,21 @@
+@@ -5224,13 +5246,21 @@
struct softnet_data *sd = this_cpu_ptr(&softnet_data);
unsigned long time_limit = jiffies + 2;
int budget = netdev_budget;
@@ -23165,7 +25344,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
for (;;) {
struct napi_struct *n;
-@@ -5239,7 +5269,7 @@
+@@ -5261,7 +5291,7 @@
list_splice_tail(&repoll, &list);
list_splice(&list, &sd->poll_list);
if (!list_empty(&sd->poll_list))
@@ -23174,7 +25353,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
net_rps_action_and_irq_enable(sd);
}
-@@ -8000,16 +8030,20 @@
+@@ -8022,16 +8052,20 @@
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_enable();
@@ -23196,7 +25375,7 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
return NOTIFY_OK;
}
-@@ -8314,8 +8348,9 @@
+@@ -8336,8 +8370,9 @@
INIT_WORK(flush, flush_backlog);
@@ -23208,9 +25387,9 @@ diff -Nur linux-4.9.6.orig/net/core/dev.c linux-4.9.6/net/core/dev.c
INIT_LIST_HEAD(&sd->poll_list);
sd->output_queue_tailp = &sd->output_queue;
#ifdef CONFIG_RPS
-diff -Nur linux-4.9.6.orig/net/core/filter.c linux-4.9.6/net/core/filter.c
---- linux-4.9.6.orig/net/core/filter.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/filter.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/net/core/filter.c linux-4.9.22/net/core/filter.c
+--- linux-4.9.22.orig/net/core/filter.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/filter.c 2017-04-18 17:19:16.718774627 +0200
@@ -1645,7 +1645,7 @@
{
int ret;
@@ -23232,9 +25411,9 @@ diff -Nur linux-4.9.6.orig/net/core/filter.c linux-4.9.6/net/core/filter.c
return ret;
}
-diff -Nur linux-4.9.6.orig/net/core/gen_estimator.c linux-4.9.6/net/core/gen_estimator.c
---- linux-4.9.6.orig/net/core/gen_estimator.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/gen_estimator.c 2017-01-28 13:59:10.103662798 +0100
+diff -Nur linux-4.9.22.orig/net/core/gen_estimator.c linux-4.9.22/net/core/gen_estimator.c
+--- linux-4.9.22.orig/net/core/gen_estimator.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/gen_estimator.c 2017-04-18 17:19:16.718774627 +0200
@@ -84,7 +84,7 @@
struct gnet_stats_basic_packed *bstats;
struct gnet_stats_rate_est64 *rate_est;
@@ -23262,9 +25441,9 @@ diff -Nur linux-4.9.6.orig/net/core/gen_estimator.c linux-4.9.6/net/core/gen_est
{
gen_kill_estimator(bstats, rate_est);
return gen_new_estimator(bstats, cpu_bstats, rate_est, stats_lock, running, opt);
-diff -Nur linux-4.9.6.orig/net/core/gen_stats.c linux-4.9.6/net/core/gen_stats.c
---- linux-4.9.6.orig/net/core/gen_stats.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/gen_stats.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/core/gen_stats.c linux-4.9.22/net/core/gen_stats.c
+--- linux-4.9.22.orig/net/core/gen_stats.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/gen_stats.c 2017-04-18 17:19:16.718774627 +0200
@@ -130,7 +130,7 @@
}
@@ -23296,9 +25475,9 @@ diff -Nur linux-4.9.6.orig/net/core/gen_stats.c linux-4.9.6/net/core/gen_stats.c
struct gnet_dump *d,
struct gnet_stats_basic_cpu __percpu *cpu,
struct gnet_stats_basic_packed *b)
-diff -Nur linux-4.9.6.orig/net/core/skbuff.c linux-4.9.6/net/core/skbuff.c
---- linux-4.9.6.orig/net/core/skbuff.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/skbuff.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/core/skbuff.c linux-4.9.22/net/core/skbuff.c
+--- linux-4.9.22.orig/net/core/skbuff.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/skbuff.c 2017-04-18 17:19:16.718774627 +0200
@@ -64,6 +64,7 @@
#include <linux/errqueue.h>
#include <linux/prefetch.h>
@@ -23430,10 +25609,10 @@ diff -Nur linux-4.9.6.orig/net/core/skbuff.c linux-4.9.6/net/core/skbuff.c
}
void __kfree_skb_defer(struct sk_buff *skb)
{
-diff -Nur linux-4.9.6.orig/net/core/sock.c linux-4.9.6/net/core/sock.c
---- linux-4.9.6.orig/net/core/sock.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/core/sock.c 2017-01-28 13:59:10.107662951 +0100
-@@ -2488,12 +2488,11 @@
+diff -Nur linux-4.9.22.orig/net/core/sock.c linux-4.9.22/net/core/sock.c
+--- linux-4.9.22.orig/net/core/sock.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/core/sock.c 2017-04-18 17:19:16.718774627 +0200
+@@ -2499,12 +2499,11 @@
if (sk->sk_lock.owned)
__lock_sock(sk);
sk->sk_lock.owned = 1;
@@ -23447,9 +25626,9 @@ diff -Nur linux-4.9.6.orig/net/core/sock.c linux-4.9.6/net/core/sock.c
}
EXPORT_SYMBOL(lock_sock_nested);
-diff -Nur linux-4.9.6.orig/net/ipv4/icmp.c linux-4.9.6/net/ipv4/icmp.c
---- linux-4.9.6.orig/net/ipv4/icmp.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/ipv4/icmp.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/ipv4/icmp.c linux-4.9.22/net/ipv4/icmp.c
+--- linux-4.9.22.orig/net/ipv4/icmp.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/ipv4/icmp.c 2017-04-18 17:19:16.718774627 +0200
@@ -69,6 +69,7 @@
#include <linux/jiffies.h>
#include <linux/kernel.h>
@@ -23557,9 +25736,9 @@ diff -Nur linux-4.9.6.orig/net/ipv4/icmp.c linux-4.9.6/net/ipv4/icmp.c
}
/* should there be an ICMP stat for ignored echos? */
return true;
-diff -Nur linux-4.9.6.orig/net/ipv4/sysctl_net_ipv4.c linux-4.9.6/net/ipv4/sysctl_net_ipv4.c
---- linux-4.9.6.orig/net/ipv4/sysctl_net_ipv4.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/ipv4/sysctl_net_ipv4.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/ipv4/sysctl_net_ipv4.c linux-4.9.22/net/ipv4/sysctl_net_ipv4.c
+--- linux-4.9.22.orig/net/ipv4/sysctl_net_ipv4.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/ipv4/sysctl_net_ipv4.c 2017-04-18 17:19:16.718774627 +0200
@@ -681,6 +681,13 @@
.proc_handler = proc_dointvec
},
@@ -23574,9 +25753,9 @@ diff -Nur linux-4.9.6.orig/net/ipv4/sysctl_net_ipv4.c linux-4.9.6/net/ipv4/sysct
.procname = "icmp_ignore_bogus_error_responses",
.data = &init_net.ipv4.sysctl_icmp_ignore_bogus_error_responses,
.maxlen = sizeof(int),
-diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
---- linux-4.9.6.orig/net/ipv4/tcp_ipv4.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/ipv4/tcp_ipv4.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/ipv4/tcp_ipv4.c linux-4.9.22/net/ipv4/tcp_ipv4.c
+--- linux-4.9.22.orig/net/ipv4/tcp_ipv4.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/ipv4/tcp_ipv4.c 2017-04-18 17:19:16.718774627 +0200
@@ -62,6 +62,7 @@
#include <linux/init.h>
#include <linux/times.h>
@@ -23585,7 +25764,7 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
#include <net/net_namespace.h>
#include <net/icmp.h>
-@@ -564,6 +565,7 @@
+@@ -568,6 +569,7 @@
}
EXPORT_SYMBOL(tcp_v4_send_check);
@@ -23593,7 +25772,7 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
/*
* This routine will send an RST to the other tcp.
*
-@@ -691,6 +693,8 @@
+@@ -695,6 +697,8 @@
offsetof(struct inet_timewait_sock, tw_bound_dev_if));
arg.tos = ip_hdr(skb)->tos;
@@ -23602,7 +25781,7 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
local_bh_disable();
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
skb, &TCP_SKB_CB(skb)->header.h4.opt,
-@@ -700,6 +704,7 @@
+@@ -704,6 +708,7 @@
__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
__TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
local_bh_enable();
@@ -23610,7 +25789,7 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
#ifdef CONFIG_TCP_MD5SIG
out:
-@@ -775,6 +780,7 @@
+@@ -779,6 +784,7 @@
if (oif)
arg.bound_dev_if = oif;
arg.tos = tos;
@@ -23618,7 +25797,7 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
local_bh_disable();
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
skb, &TCP_SKB_CB(skb)->header.h4.opt,
-@@ -783,6 +789,7 @@
+@@ -787,6 +793,7 @@
__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
local_bh_enable();
@@ -23626,10 +25805,10 @@ diff -Nur linux-4.9.6.orig/net/ipv4/tcp_ipv4.c linux-4.9.6/net/ipv4/tcp_ipv4.c
}
static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
-diff -Nur linux-4.9.6.orig/net/mac80211/rx.c linux-4.9.6/net/mac80211/rx.c
---- linux-4.9.6.orig/net/mac80211/rx.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/mac80211/rx.c 2017-01-28 13:59:10.107662951 +0100
-@@ -4166,7 +4166,7 @@
+diff -Nur linux-4.9.22.orig/net/mac80211/rx.c linux-4.9.22/net/mac80211/rx.c
+--- linux-4.9.22.orig/net/mac80211/rx.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/mac80211/rx.c 2017-04-18 17:19:16.718774627 +0200
+@@ -4180,7 +4180,7 @@
struct ieee80211_supported_band *sband;
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
@@ -23638,9 +25817,9 @@ diff -Nur linux-4.9.6.orig/net/mac80211/rx.c linux-4.9.6/net/mac80211/rx.c
if (WARN_ON(status->band >= NUM_NL80211_BANDS))
goto drop;
-diff -Nur linux-4.9.6.orig/net/netfilter/core.c linux-4.9.6/net/netfilter/core.c
---- linux-4.9.6.orig/net/netfilter/core.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/netfilter/core.c 2017-01-28 13:59:10.107662951 +0100
+diff -Nur linux-4.9.22.orig/net/netfilter/core.c linux-4.9.22/net/netfilter/core.c
+--- linux-4.9.22.orig/net/netfilter/core.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/netfilter/core.c 2017-04-18 17:19:16.722774781 +0200
@@ -22,12 +22,18 @@
#include <linux/proc_fs.h>
#include <linux/mutex.h>
@@ -23660,9 +25839,9 @@ diff -Nur linux-4.9.6.orig/net/netfilter/core.c linux-4.9.6/net/netfilter/core.c
static DEFINE_MUTEX(afinfo_mutex);
const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;
-diff -Nur linux-4.9.6.orig/net/packet/af_packet.c linux-4.9.6/net/packet/af_packet.c
---- linux-4.9.6.orig/net/packet/af_packet.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/packet/af_packet.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/packet/af_packet.c linux-4.9.22/net/packet/af_packet.c
+--- linux-4.9.22.orig/net/packet/af_packet.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/packet/af_packet.c 2017-04-18 17:19:16.722774781 +0200
@@ -63,6 +63,7 @@
#include <linux/if_packet.h>
#include <linux/wireless.h>
@@ -23689,9 +25868,9 @@ diff -Nur linux-4.9.6.orig/net/packet/af_packet.c linux-4.9.6/net/packet/af_pack
}
}
prb_close_block(pkc, pbd, po, status);
-diff -Nur linux-4.9.6.orig/net/rds/ib_rdma.c linux-4.9.6/net/rds/ib_rdma.c
---- linux-4.9.6.orig/net/rds/ib_rdma.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/rds/ib_rdma.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/rds/ib_rdma.c linux-4.9.22/net/rds/ib_rdma.c
+--- linux-4.9.22.orig/net/rds/ib_rdma.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/rds/ib_rdma.c 2017-04-18 17:19:16.722774781 +0200
@@ -34,6 +34,7 @@
#include <linux/slab.h>
#include <linux/rculist.h>
@@ -23709,9 +25888,9 @@ diff -Nur linux-4.9.6.orig/net/rds/ib_rdma.c linux-4.9.6/net/rds/ib_rdma.c
}
}
-diff -Nur linux-4.9.6.orig/net/rxrpc/security.c linux-4.9.6/net/rxrpc/security.c
---- linux-4.9.6.orig/net/rxrpc/security.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/rxrpc/security.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/rxrpc/security.c linux-4.9.22/net/rxrpc/security.c
+--- linux-4.9.22.orig/net/rxrpc/security.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/rxrpc/security.c 2017-04-18 17:19:16.722774781 +0200
@@ -19,9 +19,6 @@
#include <keys/rxrpc-type.h>
#include "ar-internal.h"
@@ -23722,9 +25901,9 @@ diff -Nur linux-4.9.6.orig/net/rxrpc/security.c linux-4.9.6/net/rxrpc/security.c
static const struct rxrpc_security *rxrpc_security_types[] = {
[RXRPC_SECURITY_NONE] = &rxrpc_no_security,
#ifdef CONFIG_RXKAD
-diff -Nur linux-4.9.6.orig/net/sched/sch_api.c linux-4.9.6/net/sched/sch_api.c
---- linux-4.9.6.orig/net/sched/sch_api.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/sched/sch_api.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/sched/sch_api.c linux-4.9.22/net/sched/sch_api.c
+--- linux-4.9.22.orig/net/sched/sch_api.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/sched/sch_api.c 2017-04-18 17:19:16.722774781 +0200
@@ -981,7 +981,7 @@
rcu_assign_pointer(sch->stab, stab);
}
@@ -23734,9 +25913,9 @@ diff -Nur linux-4.9.6.orig/net/sched/sch_api.c linux-4.9.6/net/sched/sch_api.c
err = -EOPNOTSUPP;
if (sch->flags & TCQ_F_MQROOT)
-diff -Nur linux-4.9.6.orig/net/sched/sch_generic.c linux-4.9.6/net/sched/sch_generic.c
---- linux-4.9.6.orig/net/sched/sch_generic.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/sched/sch_generic.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/sched/sch_generic.c linux-4.9.22/net/sched/sch_generic.c
+--- linux-4.9.22.orig/net/sched/sch_generic.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/sched/sch_generic.c 2017-04-18 17:19:16.722774781 +0200
@@ -425,7 +425,11 @@
.ops = &noop_qdisc_ops,
.q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock),
@@ -23776,9 +25955,9 @@ diff -Nur linux-4.9.6.orig/net/sched/sch_generic.c linux-4.9.6/net/sched/sch_gen
}
void dev_deactivate(struct net_device *dev)
-diff -Nur linux-4.9.6.orig/net/sunrpc/svc_xprt.c linux-4.9.6/net/sunrpc/svc_xprt.c
---- linux-4.9.6.orig/net/sunrpc/svc_xprt.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/net/sunrpc/svc_xprt.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/net/sunrpc/svc_xprt.c linux-4.9.22/net/sunrpc/svc_xprt.c
+--- linux-4.9.22.orig/net/sunrpc/svc_xprt.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/net/sunrpc/svc_xprt.c 2017-04-18 17:19:16.722774781 +0200
@@ -396,7 +396,7 @@
goto out;
}
@@ -23806,9 +25985,9 @@ diff -Nur linux-4.9.6.orig/net/sunrpc/svc_xprt.c linux-4.9.6/net/sunrpc/svc_xprt
out:
trace_svc_xprt_do_enqueue(xprt, rqstp);
}
-diff -Nur linux-4.9.6.orig/scripts/mkcompile_h linux-4.9.6/scripts/mkcompile_h
---- linux-4.9.6.orig/scripts/mkcompile_h 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/scripts/mkcompile_h 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/scripts/mkcompile_h linux-4.9.22/scripts/mkcompile_h
+--- linux-4.9.22.orig/scripts/mkcompile_h 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/scripts/mkcompile_h 2017-04-18 17:19:16.722774781 +0200
@@ -4,7 +4,8 @@
ARCH=$2
SMP=$3
@@ -23827,9 +26006,9 @@ diff -Nur linux-4.9.6.orig/scripts/mkcompile_h linux-4.9.6/scripts/mkcompile_h
UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"
# Truncate to maximum length
-diff -Nur linux-4.9.6.orig/sound/core/pcm_native.c linux-4.9.6/sound/core/pcm_native.c
---- linux-4.9.6.orig/sound/core/pcm_native.c 2017-01-26 08:25:24.000000000 +0100
-+++ linux-4.9.6/sound/core/pcm_native.c 2017-01-28 13:59:10.111663104 +0100
+diff -Nur linux-4.9.22.orig/sound/core/pcm_native.c linux-4.9.22/sound/core/pcm_native.c
+--- linux-4.9.22.orig/sound/core/pcm_native.c 2017-04-12 12:41:42.000000000 +0200
++++ linux-4.9.22/sound/core/pcm_native.c 2017-04-18 17:19:16.722774781 +0200
@@ -135,7 +135,7 @@
void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream)
{