4.12.2-stable review
Greg Kroah-Hartman
maintainercover 4.12.2-stable review
This is the start of the stable review cycle for the 4.12.2 release. There are 10 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Jul 15 15:40:02 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.12.2-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.12.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.12.2-rc1
Mikulas Patocka <[email protected]>
x86/mm/pat: Don't report PAT on CPUs that don't support it
Chao Yu <[email protected]>
ext4: check return value of kstrtoull correctly in reserved_clusters_store
Jason A. Donenfeld <[email protected]>
crypto: rsa-pkcs1pad - use constant time memory comparison for MACs
Horia Geantă <[email protected]>
crypto: caam - fix gfp allocation flags (part I)
Ian Abbott <[email protected]>
staging: comedi: fix clean-up of comedi_class in comedi_init()
Malcolm Priestley <[email protected]>
staging: vt6556: vnt_start Fix missing call to vnt_key_init_table.
Kirill Tkhai <[email protected]>
locking/rwsem-spinlock: Fix EINTR branch in __down_write_common()
Eric W. Biederman <[email protected]>
proc: Fix proc_sys_prune_dcache to hold a sb reference
Peter Senna Tschudin <[email protected]>
imx-serial: RX DMA startup latency
Cong Wang <[email protected]>
mqueue: fix a use-after-free in sys_mq_notify()
-------------
Diffstat:
Makefile | 4 ++-- arch/x86/include/asm/pat.h | 1 + arch/x86/kernel/setup.c | 7 ++++++ arch/x86/mm/pat.c | 28 ++++++++++------------- crypto/rsa-pkcs1pad.c | 2 +- drivers/crypto/caam/caamalg.c | 3 +-- drivers/staging/comedi/comedi_fops.c | 1 + drivers/staging/vt6656/main_usb.c | 3 +++ drivers/tty/serial/imx.c | 26 +++++----------------- fs/ext4/sysfs.c | 2 +- fs/proc/internal.h | 2 +- fs/proc/proc_sysctl.c | 43 +++++++++++++++++++++++++----------- include/linux/sysctl.h | 2 +- ipc/mqueue.c | 4 +++- kernel/locking/rwsem-spinlock.c | 4 ++-- 15 files changed, 71 insertions(+), 61 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/10 mqueue: fix a use-after-free in sys_mq_notify()
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit f991af3daabaecff34684fd51fac80319d1baad1 upstream.
The retry logic for netlink_attachskb() inside sys_mq_notify() is nasty and vulnerable:
1) The sock refcnt is already released when retry is needed
2) The fd is controllable by user-space because we already release the file refcnt
so we when retry but the fd has been just closed by user-space during this small window, we end up calling netlink_detachskb() on the error path which releases the sock again, later when the user-space closes this socket a use-after-free could be triggered.
Setting 'sock' to NULL here should be sufficient to fix it.
--- ipc/mqueue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
ipc/mqueue.c +3 -1
@@ -1253,8 +1253,10 @@ retry: timeo =MAX_SCHEDULE_TIMEOUT ; ret =netlink_attachskb (sock, nc, &timeo,NULL ); -if (ret ==1 ) +if (ret ==1 ) { + sock =NULL ; goto retry; + }if (ret) { sock =NULL ; nc =NULL ;
Greg Kroah-Hartman
maintainerPATCH 2/10 imx-serial: RX DMA startup latency
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Senna Tschudin <[email protected]>
commit 4dec2f119e86f9c91e60cdd8f0cc057452e331a9 upstream.
18a4208 introduced a change to reduce the RX DMA latency on the first reception when the serial port was opened for reading. However it was claiming a hardirq unsafe lock after a hardirq safe lock which is not allowed and causes lockdep to complain verbosely.
This patch changes the code to always start RX DMA earlier, instead of relying on the flags used to open the serial port removing the code that was looking for the serial file flags.
--- drivers/tty/serial/imx.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-)
drivers/tty/serial/imx.c +5 -21
@@ -1340,29 +1340,13 @@ static int imx_startup(struct uart_portimx_enable_ms (&sport->port);/* -* If the serial port is opened for reading start RX DMA immediately -* instead of waiting for RX FIFO interrupts. In our iMX53 the average -* delay for the first reception dropped from approximately 35000 -* microseconds to 1000 microseconds. +* Start RX DMA immediately instead of waiting for RX FIFO interrupts. +* In our iMX53 the average delay for the first reception dropped from +* approximately 35000 microseconds to 1000 microseconds. */ if (sport->dma_is_enabled) { -struct tty_struct *tty = sport->port.state->port.tty; -struct tty_file_private *file_priv; -int readcnt =0 ; - -spin_lock (&tty->files_lock); - -if (!list_empty (&tty->tty_files)) -list_for_each_entry (file_priv, &tty->tty_files, list) -if (!(file_priv->file->f_flags &O_WRONLY )) - readcnt++; - -spin_unlock (&tty->files_lock); - -if (readcnt >0 ) { -imx_disable_rx_int (sport); -start_rx_dma (sport); - } +imx_disable_rx_int (sport); +start_rx_dma (sport); }spin_unlock_irqrestore (&sport->port.lock, flags);
Greg Kroah-Hartman
maintainerPATCH 3/10 proc: Fix proc_sys_prune_dcache to hold a sb reference
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric W. Biederman <[email protected]>
commit 2fd1d2c4ceb2248a727696962cf3370dc9f5a0a4 upstream.
Andrei Vagin writes:
FYI: This bug has been reproduced on 4.11.7
Quoted 35 lines
BUG: Dentry ffff895a3dd01240{i=4e7c09a,n=lo} still in use (1) [unmount of proc proc]
------------[ cut here ]------------
WARNING: CPU: 1 PID: 13588 at fs/dcache.c:1445 umount_check+0x6e/0x80
CPU: 1 PID: 13588 Comm: kworker/1:1 Not tainted 4.11.7-200.fc25.x86_64 #1
Hardware name: CompuLab sbc-flt1/fitlet, BIOS SBCFLT_0.08.04 06/27/2015
Workqueue: events proc_cleanup_work
Call Trace:
dump_stack+0x63/0x86
__warn+0xcb/0xf0
warn_slowpath_null+0x1d/0x20
umount_check+0x6e/0x80
d_walk+0xc6/0x270
? dentry_free+0x80/0x80
do_one_tree+0x26/0x40
shrink_dcache_for_umount+0x2d/0x90
generic_shutdown_super+0x1f/0xf0
kill_anon_super+0x12/0x20
proc_kill_sb+0x40/0x50
deactivate_locked_super+0x43/0x70
deactivate_super+0x5a/0x60
cleanup_mnt+0x3f/0x90
mntput_no_expire+0x13b/0x190
kern_unmount+0x3e/0x50
pid_ns_release_proc+0x15/0x20
proc_cleanup_work+0x15/0x20
process_one_work+0x197/0x450
worker_thread+0x4e/0x4a0
kthread+0x109/0x140
? process_one_work+0x450/0x450
? kthread_park+0x90/0x90
ret_from_fork+0x2c/0x40
---[ end trace e1c109611e5d0b41 ]---
VFS: Busy inodes after unmount of proc. Self-destruct in 5 seconds. Have a nice day...
BUG: unable to handle kernel NULL pointer dereference at (null)
IP: _raw_spin_lock+0xc/0x30Quoted 1 line
PGD 0
Fix this by taking a reference to the super block in proc_sys_prune_dcache.
The superblock reference is the core of the fix however the sysctl_inodes list is converted to a hlist so that hlist_del_init_rcu may be used. This allows proc_sys_prune_dache to remove inodes the sysctl_inodes list, while not causing problems for proc_sys_evict_inode when if it later choses to remove the inode from the sysctl_inodes list. Removing inodes from the sysctl_inodes list allows proc_sys_prune_dcache to have a progress guarantee, while still being able to drop all locks. The fact that head->unregistering is set in start_unregistering ensures that no more inodes will be added to the the sysctl_inodes list.
Previously the code did a dance where it delayed calling iput until the next entry in the list was being considered to ensure the inode remained on the sysctl_inodes list until the next entry was walked to. The structure of the loop in this patch does not need that so is much easier to understand and maintain.
--- fs/proc/internal.h | 2 +- fs/proc/proc_sysctl.c | 43 ++++++++++++++++++++++++++++++------------- include/linux/sysctl.h | 2 +- 3 files changed, 32 insertions(+), 15 deletions(-)
fs/proc/internal.h +1 -1
@@ -67,7 +67,7 @@ struct proc_inode {struct proc_dir_entry *pde;struct ctl_table_header *sysctl;struct ctl_table *sysctl_entry; -struct list_head sysctl_inodes; +struct hlist_node sysctl_inodes;const struct proc_ns_operations *ns_ops;struct inode vfs_inode; };
fs/proc/proc_sysctl.c +30 -13
76 lines not on this page · raw message
include/linux/sysctl.h +1 -1
@@ -143,7 +143,7 @@ struct ctl_table_headerstruct ctl_table_set *set;struct ctl_dir *parent;struct ctl_node *node; -struct list_head inodes;/* head for proc_inode->sysctl_inodes */ +struct hlist_head inodes;/* head for proc_inode->sysctl_inodes */ };struct ctl_dir {
Greg Kroah-Hartman
maintainerPATCH 4/10 locking/rwsem-spinlock: Fix EINTR branch in __down_write_common()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill Tkhai <[email protected]>
commit a0c4acd2c220376b4e9690e75782d0c0afdaab9f upstream.
If a writer could been woken up, the above branch
if (sem->count == 0) break;
would have moved us to taking the sem. So, it's
not the time to wake a writer now, and only readers are allowed now. Thus, 0 must be passed to __rwsem_do_wake().
Next, __rwsem_do_wake() wakes readers unconditionally. But we mustn't do that if the sem is owned by writer in the moment. Otherwise, writer and reader own the sem the same time, which leads to memory corruption in callers.
rwsem-xadd.c does not need that, as:
1) the similar check is made lockless there,
2) in __rwsem_mark_wake::try_reader_grant we test,
that sem is not owned by writer.
--- kernel/locking/rwsem-spinlock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/locking/rwsem-spinlock.c +2 -2
@@ -231,8 +231,8 @@ int __sched __down_write_common(struct r out_nolock:list_del (&waiter.list); -if (!list_empty (&sem->wait_list)) -__rwsem_do_wake (sem,1 ); +if (!list_empty (&sem->wait_list) && sem->count >=0 ) +__rwsem_do_wake (sem,0 );raw_spin_unlock_irqrestore (&sem->wait_lock, flags);return -EINTR ;
Greg Kroah-Hartman
maintainerPATCH 5/10 staging: vt6556: vnt_start Fix missing call to vnt_key_init_table.
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Malcolm Priestley <[email protected]>
commit dc32190f2cd41c7dba25363ea7d618d4f5172b4e upstream.
The key table is not intialized correctly without this call.
--- drivers/staging/vt6656/main_usb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/staging/vt6656/main_usb.c +3 -0
@@ -513,6 +513,9 @@ static int vnt_start(struct ieee80211_hw goto free_all; } +if (vnt_key_init_table (priv)) + goto free_all; + priv->int_interval =1 ;/* bInterval is set to 1 */ vnt_int_start_interrupt (priv);
Greg Kroah-Hartman
maintainerPATCH 6/10 staging: comedi: fix clean-up of comedi_class in comedi_init()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit a9332e9ad09c2644c99058fcf6ae2f355e93ce74 upstream.
There is a clean-up bug in the core comedi module initialization functions, comedi_init(). If the comedi_num_legacy_minors module parameter is non-zero (and valid), it creates that many "legacy" devices and registers them in SysFS. A failure causes the function to clean up and return an error. Unfortunately, it fails to destroy the "comedi" class that was created earlier. Fix it by adding a call to class_destroy(comedi_class) at the appropriate place in the clean-up sequence.
--- drivers/staging/comedi/comedi_fops.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/comedi/comedi_fops.c +1 -0
@@ -2915,6 +2915,7 @@ static int __init comedi_init(void) dev =comedi_alloc_board_minor (NULL );if (IS_ERR (dev)) {comedi_cleanup_board_minors (); +class_destroy (comedi_class);cdev_del (&comedi_cdev);unregister_chrdev_region (MKDEV (COMEDI_MAJOR ,0 ),COMEDI_NUM_MINORS );
Greg Kroah-Hartman
maintainerPATCH 9/10 ext4: check return value of kstrtoull correctly in reserved_clusters_store
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
commit 1ea1516fbbab2b30bf98c534ecaacba579a35208 upstream.
kstrtoull returns 0 on success, however, in reserved_clusters_store we will return -EINVAL if kstrtoull returns 0, it makes us fail to update reserved_clusters value through sysfs.
--- fs/ext4/sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/sysfs.c +1 -1
@@ -100,7 +100,7 @@ static ssize_t reserved_clusters_store(sint ret; ret =kstrtoull (skip_spaces (buf),0 , &val); -if (!ret || val >= clusters) +if (ret || val >= clusters)return -EINVAL ;atomic64_set (&sbi->s_resv_clusters, val);
Greg Kroah-Hartman
maintainerPATCH 10/10 x86/mm/pat: Dont report PAT on CPUs that dont support it
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 99c13b8c8896d7bcb92753bf0c63a8de4326e78d upstream.
The pat_enabled() logic is broken on CPUs which do not support PAT and where the initialization code fails to call pat_init(). Due to that the enabled flag stays true and pat_enabled() returns true wrongfully.
As a consequence the mappings, e.g. for Xorg, are set up with the wrong caching mode and the required MTRR setups are omitted.
To cure this the following changes are required:
1) Make pat_enabled() return true only if PAT initialization was invoked and successful.
2) Invoke init_cache_modes() unconditionally in setup_arch() and remove the extra callsites in pat_disable() and the pat disabled code path in pat_init().
Also rename __pat_enabled to pat_disabled to reflect the real purpose of this variable.
--- arch/x86/include/asm/pat.h | 1 + arch/x86/kernel/setup.c | 7 +++++++ arch/x86/mm/pat.c | 28 ++++++++++++---------------- 3 files changed, 20 insertions(+), 16 deletions(-)
arch/x86/include/asm/pat.h +1 -0
@@ -7,6 +7,7 @@bool pat_enabled (void );void pat_disable (const char *reason);extern void pat_init (void ); +extern void init_cache_modes (void );extern int reserve_memtype (u64 start,u64 end,enum page_cache_mode req_pcm,enum page_cache_mode *ret_pcm);
arch/x86/kernel/setup.c +7 -0
@@ -1076,6 +1076,13 @@ void __init setup_arch(char **cmdline_p) max_possible_pfn = max_pfn;/* +* This call is required when the CPU does not support PAT. If +* mtrr_bp_init() invoked it already via pat_init() the call has no +* effect. +*/ +init_cache_modes (); + +/* * Define random base addresses for memory sections after max_pfn is * defined and before each memory section base is used. */
arch/x86/mm/pat.c +12 -16
@@ -37,14 +37,14 @@#undef pr_fmt#define pr_fmt (fmt) "" fmt -static bool boot_cpu_done; - -static int __read_mostly __pat_enabled =IS_ENABLED (CONFIG_X86_PAT ); -static void init_cache_modes (void ); +static bool __read_mostly boot_cpu_done; +static bool __read_mostly pat_disabled = !IS_ENABLED (CONFIG_X86_PAT ); +static bool __read_mostly pat_initialized; +static bool __read_mostly init_cm_done;void pat_disable (const char *reason) { -if (!__pat_enabled) +if (pat_disabled)return ;if (boot_cpu_done) {
@@ -52,10 +52,8 @@ void pat_disable(const char *reason)return ; } - __pat_enabled =0 ; + pat_disabled = true;pr_info ("x86/PAT: %s\n" , reason); - -init_cache_modes (); }static int __init nopat (char *str)
@@ -67,7 +65,7 @@ early_param("nopat", nopat);bool pat_enabled (void ) { -return !!__pat_enabled; +return pat_initialized; }EXPORT_SYMBOL_GPL (pat_enabled);
@@ -205,6 +203,8 @@ static void __init_cache_modes(u64 pat)update_cache_mode_entry (i, cache); }pr_info ("x86/PAT: Configuration [0-7]: %s\n" , pat_msg); + + init_cm_done = true; }#define PAT (x, y) ((u64)PAT_ ## y << ((x)*8))
@@ -225,6 +225,7 @@ static void pat_bsp_init(u64 pat) }wrmsrl (MSR_IA32_CR_PAT , pat); + pat_initialized = true;__init_cache_modes (pat); }
@@ -242,10 +243,9 @@ static void pat_ap_init(u64 pat)wrmsrl (MSR_IA32_CR_PAT , pat); } -static void init_cache_modes (void ) +void init_cache_modes (void ) {u64 pat =0 ; -static int init_cm_done;if (init_cm_done)return ;
@@ -287,8 +287,6 @@ static void init_cache_modes(void) }__init_cache_modes (pat); - - init_cm_done =1 ; }/**
@@ -306,10 +304,8 @@ void pat_init(void)u64 pat;struct cpuinfo_x86 *c = &boot_cpu_data; -if (!pat_enabled ()) { -init_cache_modes (); +if (pat_disabled)return ; - } if ((c->x86_vendor == X86_VENDOR_INTEL) && (((c->x86 == 0x6) && (c->x86_model <= 0xd)) ||
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.2 release. There are 10 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Jul 15 15:40:02 UTC 2017. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.2 release. There are 10 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Jul 15 15:40:02 UTC 2017. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0Details are available at http://kerneltests.org/builders.
Thanks for testing all of these and letting me know.
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 1 line · kernelci.org bot
stable-rc/linux-4.12.y boot: 226 boots: 5 failed, 216 passed with 4 offline, 1 conflict (v4.12.1-11-g28917cd49df9)
Should I be concerned about these 5 failures? No other test systems shows any problems...
thanks,
greg k-h
Quoted 9 lines · kernelci.org bot
multi_v7_defconfig
imx6ul-pico-hobbit_rootfs:nfs: 1 failed lab
mvebu_v5_defconfig
kirkwood-openblocks_a7_rootfs:nfs: 1 failed labmulti_v7_defconfig+CONFIG_PROVE_LOCKING=y
omap4-panda: 1 failed lab
These look at first glance labs were having a bad day.
Quoted 1 line
sun5i-r8-chip: 1 failed lab
This one isn't immediately obvious to me, the kernel got to the end of boot then nothing from userspace:
https://storage.kernelci.org/stable-rc/linux-4.12.y/v4.12.1-11-g28917cd49df9/arm/multi_v7_defconfig+CONFIG_PROVE_LOCKING=y/lab-free-electrons/boot-sun5i-r8-chip.html
Quoted 2 lines
multi_v7_defconfig+CONFIG_SMP=n
sun5i-r8-chip: 1 failed lab
Same board, same symptoms. It's not booting in -next either in a similar way so I'd not worry about it for now.
Greg Kroah-Hartman
maintainerQuoted 19 lines · Mark Brown
Quoted 9 lines · kernelci.org bot
multi_v7_defconfig
imx6ul-pico-hobbit_rootfs:nfs: 1 failed lab
mvebu_v5_defconfig
kirkwood-openblocks_a7_rootfs:nfs: 1 failed labmulti_v7_defconfig+CONFIG_PROVE_LOCKING=y
omap4-panda: 1 failed labThese look at first glance labs were having a bad day.
Quoted 1 line
sun5i-r8-chip: 1 failed lab
This one isn't immediately obvious to me, the kernel got to the end of boot then nothing from userspace:
Quoted 7 lines
https://storage.kernelci.org/stable-rc/linux-4.12.y/v4.12.1-11-g28917cd49df9/arm/multi_v7_defconfig+CONFIG_PROVE_LOCKING=y/lab-free-electrons/boot-sun5i-r8-chip.htmlQuoted 2 lines
multi_v7_defconfig+CONFIG_SMP=n
sun5i-r8-chip: 1 failed labSame board, same symptoms. It's not booting in -next either in a similar way so I'd not worry about it for now.
Ok, thanks for looking into these.
greg k-h