diff --git a/pre-patches/vanilla-4.14/0001-mars-SPECIAL-for-in-tree-build.patch b/pre-patches/vanilla-4.14/0001-mars-SPECIAL-for-in-tree-build.patch new file mode 100644 index 00000000..2957810f --- /dev/null +++ b/pre-patches/vanilla-4.14/0001-mars-SPECIAL-for-in-tree-build.patch @@ -0,0 +1,36 @@ +From 31fddf3606570055b05a23cf6d105a489d9c024c Mon Sep 17 00:00:00 2001 +From: Thomas Schoebel-Theuer +Date: Fri, 28 Jun 2013 11:03:14 +0200 +Subject: [PATCH] mars: SPECIAL for in-tree build + +--- + block/Kconfig | 2 ++ + block/Makefile | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/block/Kconfig b/block/Kconfig +index 28ec55752b68..97bf8908f19e 100644 +--- a/block/Kconfig ++++ b/block/Kconfig +@@ -190,6 +190,8 @@ source "block/partitions/Kconfig" + + endmenu + ++source block/mars/kernel/Kconfig ++ + endif # BLOCK + + config BLOCK_COMPAT +diff --git a/block/Makefile b/block/Makefile +index 6a56303b9925..8bb30c30ad20 100644 +--- a/block/Makefile ++++ b/block/Makefile +@@ -35,3 +35,5 @@ obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o + obj-$(CONFIG_BLK_WBT) += blk-wbt.o + obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-debugfs.o + obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o ++ ++obj-$(CONFIG_MARS) += mars/kernel/ +-- +2.19.0 + diff --git a/pre-patches/vanilla-4.14/0001-mars-minimum-pre-patch-for-mars.patch b/pre-patches/vanilla-4.14/0001-mars-minimum-pre-patch-for-mars.patch new file mode 100644 index 00000000..9ee59f6f --- /dev/null +++ b/pre-patches/vanilla-4.14/0001-mars-minimum-pre-patch-for-mars.patch @@ -0,0 +1,177 @@ +From 090750dac1e13f2e3a40be1dce09a262b592de71 Mon Sep 17 00:00:00 2001 +From: Thomas Schoebel-Theuer +Date: Mon, 22 Aug 2016 12:54:44 +0200 +Subject: [PATCH] mars: minimum pre-patch for mars + +Mostly introduces some EXPORT_SYMBOL(). +Should have almost no impact onto the kernel. +--- + fs/aio.c | 5 +++++ + fs/namei.c | 5 +++++ + fs/open.c | 2 ++ + fs/utimes.c | 2 ++ + include/uapi/linux/major.h | 1 + + mm/page_alloc.c | 2 ++ + 6 files changed, 17 insertions(+) + +diff --git a/fs/aio.c b/fs/aio.c +index a2de58f77338..5cec5c1c7817 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -1397,6 +1397,7 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) + out: + return ret; + } ++EXPORT_SYMBOL(sys_io_setup); + + #ifdef CONFIG_COMPAT + COMPAT_SYSCALL_DEFINE2(io_setup, unsigned, nr_events, u32 __user *, ctx32p) +@@ -1466,6 +1467,7 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) + pr_debug("EINVAL: invalid context id\n"); + return -EINVAL; + } ++EXPORT_SYMBOL(sys_io_destroy); + + static int aio_setup_rw(int rw, struct iocb *iocb, struct iovec **iovec, + bool vectored, bool compat, struct iov_iter *iter) +@@ -1715,6 +1717,7 @@ static long do_io_submit(aio_context_t ctx_id, long nr, + percpu_ref_put(&ctx->users); + return i ? i : ret; + } ++EXPORT_SYMBOL(sys_io_submit); + + /* sys_io_submit: + * Queue the nr iocbs pointed to by iocbpp for processing. Returns +@@ -1842,6 +1845,7 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, + + return ret; + } ++EXPORT_SYMBOL(sys_io_cancel); + + /* io_getevents: + * Attempts to read at least min_nr events and up to nr events from +@@ -1871,6 +1875,7 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id, + } + return ret; + } ++EXPORT_SYMBOL(sys_io_getevents); + + #ifdef CONFIG_COMPAT + COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id, +diff --git a/fs/namei.c b/fs/namei.c +index d1e467b7b9de..18fccefcf953 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3879,6 +3879,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode) + { + return sys_mkdirat(AT_FDCWD, pathname, mode); + } ++EXPORT_SYMBOL(sys_mkdir); + + int vfs_rmdir(struct inode *dir, struct dentry *dentry) + { +@@ -3982,6 +3983,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) + { + return do_rmdir(AT_FDCWD, pathname); + } ++EXPORT_SYMBOL(sys_rmdir); + + /** + * vfs_unlink - unlink a filesystem object +@@ -4135,6 +4137,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) + { + return do_unlinkat(AT_FDCWD, pathname); + } ++EXPORT_SYMBOL(sys_unlink); + + int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) + { +@@ -4192,6 +4195,7 @@ SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newn + { + return sys_symlinkat(oldname, AT_FDCWD, newname); + } ++EXPORT_SYMBOL(sys_symlink); + + /** + * vfs_link - create a new link +@@ -4680,6 +4684,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna + { + return sys_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0); + } ++EXPORT_SYMBOL(sys_rename); + + int vfs_whiteout(struct inode *dir, struct dentry *dentry) + { +diff --git a/fs/open.c b/fs/open.c +index 28a3956c4479..413e7239fce8 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -576,6 +576,7 @@ SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode) + { + return sys_fchmodat(AT_FDCWD, filename, mode); + } ++EXPORT_SYMBOL(sys_chmod); + + static int chown_common(const struct path *path, uid_t user, gid_t group) + { +@@ -661,6 +662,7 @@ SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group + return sys_fchownat(AT_FDCWD, filename, user, group, + AT_SYMLINK_NOFOLLOW); + } ++EXPORT_SYMBOL(sys_lchown); + + SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group) + { +diff --git a/fs/utimes.c b/fs/utimes.c +index e4b3d7c2c9f5..e24cfb5e9c5c 100644 +--- a/fs/utimes.c ++++ b/fs/utimes.c +@@ -1,4 +1,5 @@ + // SPDX-License-Identifier: GPL-2.0 ++#include + #include + #include + #include +@@ -164,6 +165,7 @@ long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, + out: + return error; + } ++EXPORT_SYMBOL(do_utimes); + + SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename, + struct timespec __user *, utimes, int, flags) +diff --git a/include/uapi/linux/major.h b/include/uapi/linux/major.h +index 7e5fa8e15c43..edfbce01e4ac 100644 +--- a/include/uapi/linux/major.h ++++ b/include/uapi/linux/major.h +@@ -149,6 +149,7 @@ + #define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT) + + #define DRBD_MAJOR 147 ++#define MARS_MAJOR 148 + #define RTF_MAJOR 150 + #define RAW_MAJOR 162 + +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 923deb33bf34..e6597c63ecaf 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -259,6 +259,7 @@ compound_page_dtor * const compound_page_dtors[] = { + }; + + int min_free_kbytes = 1024; ++EXPORT_SYMBOL(min_free_kbytes); + int user_min_free_kbytes = -1; + int watermark_scale_factor = 10; + +@@ -6945,6 +6946,7 @@ static void __setup_per_zone_wmarks(void) + /* update totalreserve_pages */ + calculate_totalreserve_pages(); + } ++EXPORT_SYMBOL(setup_per_zone_wmarks); + + /** + * setup_per_zone_wmarks - called when min_free_kbytes changes +-- +2.19.0 + diff --git a/pre-patches/vanilla-4.14/0001-sched-wait-fix-endless-kthread-loop-at-timeout.patch b/pre-patches/vanilla-4.14/0001-sched-wait-fix-endless-kthread-loop-at-timeout.patch new file mode 100644 index 00000000..0afc3cdd --- /dev/null +++ b/pre-patches/vanilla-4.14/0001-sched-wait-fix-endless-kthread-loop-at-timeout.patch @@ -0,0 +1,104 @@ +From ec9819653ff6f58549d1873647bd4b7875babff7 Mon Sep 17 00:00:00 2001 +From: Thomas Schoebel-Theuer +Date: Fri, 8 Mar 2019 08:21:15 +0100 +Subject: [PATCH] sched/wait: fix endless kthread loop at timeout + +Scenario, possible since kernel 4.11.x and later: + +1) kthread calls a waiting function with a timeout, and blocks. +2) kthread_stop() is called by somebody else. +3) kthread makes some progress, but neither finishes nor timeouts. +4) Nothing happens => normally the timeout would be reached by the kthread. + +However, the condition in wait_woken() now prevents the call to +schedule_timeout(). +As a consequence, the timeout value will never be decreased, resulting +in an endless loop. + +This fix ensures the following semantics: kthread_should_stop() is treated +as equivalent to a timeout. This is beneficial because most users do not +want to wait for the timeout, but to stop the kthread as soon as possible. +It appears that this semantics was probably intended (otherwise the check +is_kthread_should_stop() would not make much sense), but just went wrong +due to the bug. + +Here is an example, triggered by external kernel module MARS on a +production kernel. However, the problem can be also triggered by other +kthreads and on newer kernels, and also in very different scenarios, +not only during tcp_revcmsg(). + +In the following example, the kthread simply waits for network packets +to arrive, but in the test scenario the network had been blocked +underneath by a firewall rule in order to trigger the bug: + +Mar 08 07:40:08 icpu5133 kernel: watchdog: BUG: soft lockup - CPU#29 stuck for 23s! [mars_receiver8.:8139] +Mar 08 07:40:08 icpu5133 kernel: Modules linked in: mars(-) ip6table_mangle ip6table_raw iptable_raw ip_set_bitmap_port xt_DSCP xt_multiport ip_set_hash_ip xt_own +Mar 08 07:40:08 icpu5133 kernel: irq event stamp: 300719885 +Mar 08 07:40:08 icpu5133 kernel: hardirqs last enabled at (300719883): [] _raw_spin_unlock_irqrestore+0x3d/0x4f +Mar 08 07:40:08 icpu5133 kernel: hardirqs last disabled at (300719885): [] apic_timer_interrupt+0x82/0x90 +Mar 08 07:40:08 icpu5133 kernel: softirqs last enabled at (300719878): [] lock_sock_nested+0x50/0x98 +Mar 08 07:40:08 icpu5133 kernel: softirqs last disabled at (300719884): [] release_sock+0x16/0xda +Mar 08 07:40:08 icpu5133 kernel: CPU: 29 PID: 8139 Comm: mars_receiver8. Not tainted 4.14.104+ #121 +Mar 08 07:40:08 icpu5133 kernel: Hardware name: Dell Inc. PowerEdge R630/02C2CP, BIOS 2.5.5 08/16/2017 +Mar 08 07:40:08 icpu5133 kernel: task: ffff88bf82764fc0 task.stack: ffffc90012430000 +Mar 08 07:40:08 icpu5133 kernel: RIP: 0010:arch_local_irq_restore+0x2/0x8 +Mar 08 07:40:08 icpu5133 kernel: RSP: 0018:ffffc90012433b78 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff10 +Mar 08 07:40:08 icpu5133 kernel: RAX: 0000000000000000 RBX: ffff88bf82764fc0 RCX: 00000000fec792b4 +Mar 08 07:40:08 icpu5133 kernel: RDX: 00000000c18b50d3 RSI: 0000000000000000 RDI: 0000000000000246 +Mar 08 07:40:08 icpu5133 kernel: RBP: 0000000000000001 R08: 0000000000000001 R09: 0000000000000000 +Mar 08 07:40:08 icpu5133 kernel: R10: ffffc90012433b08 R11: ffffc90012433ba8 R12: 0000000000000246 +Mar 08 07:40:08 icpu5133 kernel: R13: ffffffff819df735 R14: 0000000000000001 R15: ffff88bf82765818 +Mar 08 07:40:08 icpu5133 kernel: FS: 0000000000000000(0000) GS:ffff88c05fb80000(0000) knlGS:0000000000000000 +Mar 08 07:40:08 icpu5133 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +Mar 08 07:40:08 icpu5133 kernel: CR2: 000055abd12eb688 CR3: 000000000241e006 CR4: 00000000001606e0 +Mar 08 07:40:08 icpu5133 kernel: Call Trace: +Mar 08 07:40:08 icpu5133 kernel: lock_release+0x32f/0x33b +Mar 08 07:40:08 icpu5133 kernel: release_sock+0x90/0xda +Mar 08 07:40:08 icpu5133 kernel: sk_wait_data+0x7f/0x13f +Mar 08 07:40:08 icpu5133 kernel: ? prepare_to_wait_exclusive+0xc1/0xc1 +Mar 08 07:40:08 icpu5133 kernel: tcp_recvmsg+0x4e6/0x91a +Mar 08 07:40:08 icpu5133 kernel: ? flush_signals+0x2b/0x6a +Mar 08 07:40:08 icpu5133 kernel: ? lock_acquire+0x20a/0x25a +Mar 08 07:40:08 icpu5133 kernel: inet_recvmsg+0x8d/0xc0 +Mar 08 07:40:08 icpu5133 kernel: kernel_recvmsg+0x8f/0xaa +Mar 08 07:40:08 icpu5133 kernel: ? ___might_sleep+0xf2/0x256 +Mar 08 07:40:08 icpu5133 kernel: mars_recv_raw+0x22a/0x4da [mars] +Mar 08 07:40:08 icpu5133 kernel: desc_recv_struct+0x40/0x375 [mars] +Mar 08 07:40:08 icpu5133 kernel: receiver_thread+0xa2/0x61a [mars] +Mar 08 07:40:08 icpu5133 kernel: ? _hash_insert+0x160/0x160 [mars] +Mar 08 07:40:08 icpu5133 kernel: ? kthread+0x1a6/0x1ae +Mar 08 07:40:08 icpu5133 kernel: kthread+0x1a6/0x1ae +Mar 08 07:40:08 icpu5133 kernel: ? __list_del_entry+0x60/0x60 +Mar 08 07:40:08 icpu5133 kernel: ret_from_fork+0x3a/0x50 +Mar 08 07:40:08 icpu5133 kernel: Code: ee e8 c5 17 00 00 48 85 db 75 0e 31 f6 48 c7 c7 c0 5f 53 82 e8 68 b9 58 00 48 89 5b 58 58 5b 5d c3 9c 58 0f 1f 44 00 00 c3 + +Signed-off-by: Thomas Schoebel-Theuer +--- + kernel/sched/wait.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c +index 6eb1f8efd221..73fe49781975 100644 +--- a/kernel/sched/wait.c ++++ b/kernel/sched/wait.c +@@ -415,8 +415,15 @@ long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout) + * or woken_wake_function() sees our store to current->state. + */ + set_current_state(mode); /* A */ +- if (!(wq_entry->flags & WQ_FLAG_WOKEN) && !is_kthread_should_stop()) +- timeout = schedule_timeout(timeout); ++ if (!(wq_entry->flags & WQ_FLAG_WOKEN)) { ++ /* ++ * Treat kthread stopping as equivalent to a timeout. ++ */ ++ if (is_kthread_should_stop()) ++ timeout = 0; ++ else ++ timeout = schedule_timeout(timeout); ++ } + __set_current_state(TASK_RUNNING); + + /* +-- +2.19.0 +