Patch "powerpc/crypto/crc32c-vpmsum: Fix missing preempt_disable()" has been added to the 4.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
powerpc/crypto/crc32c-vpmsum: Fix missing preempt_disable()
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
powerpc-crypto-crc32c-vpmsum-fix-missing-preempt_disable.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4749228f022893faf54a3dbc70796f78b7d4f342Mon Sep 17 00:00:00 2001
From: Michael Ellerman <[email protected]>
Date: Thu, 6 Apr 2017 23:34:38 +1000
Subject: powerpc/crypto/crc32c-vpmsum: Fix missing preempt_disable()
From: Michael Ellerman <[email protected]>
commit 4749228f022893faf54a3dbc70796f78b7d4f342 upstream.
In crc32c_vpmsum() we call enable_kernel_altivec() without first disabling preemption, which is not allowed:
WARNING: CPU: 9 PID: 2949 at ../arch/powerpc/kernel/process.c:277 enable_kernel_altivec+0x100/0x120
Modules linked in: dm_thin_pool dm_persistent_data dm_bio_prison dm_bufio libcrc32c vmx_crypto ...
CPU: 9 PID: 2949 Comm: docker Not tainted 4.11.0-rc5-compiler_gcc-6.3.1-00033-g308ac7563944 #381
...
NIP [c00000000001e320] enable_kernel_altivec+0x100/0x120
LR [d000000003df0910] crc32c_vpmsum+0x108/0x150 [crc32c_vpmsum]
Call Trace:
0xc138fd09 (unreliable)
crc32c_vpmsum+0x108/0x150 [crc32c_vpmsum]
crc32c_vpmsum_update+0x3c/0x60 [crc32c_vpmsum]
crypto_shash_update+0x88/0x1c0
crc32c+0x64/0x90 [libcrc32c]
dm_bm_checksum+0x48/0x80 [dm_persistent_data]
sb_check+0x84/0x120 [dm_thin_pool]
dm_bm_validate_buffer.isra.0+0xc0/0x1b0 [dm_persistent_data]
dm_bm_read_lock+0x80/0xf0 [dm_persistent_data]
__create_persistent_data_objects+0x16c/0x810 [dm_thin_pool]
dm_pool_metadata_open+0xb0/0x1a0 [dm_thin_pool]
pool_ctr+0x4cc/0xb60 [dm_thin_pool]
dm_table_add_target+0x16c/0x3c0
table_load+0x184/0x400
ctl_ioctl+0x2f0/0x560
dm_ctl_ioctl+0x38/0x50
do_vfs_ioctl+0xd8/0x920
SyS_ioctl+0x68/0xc0
system_call+0x38/0xfcIt used to be sufficient just to call pagefault_disable(), because that also disabled preemption. But the two were decoupled in commit 8222dbe21e79 ("sched/preempt, mm/fault: Decouple preemption from the page fault logic") in mid 2015.
So add the missing preempt_disable/enable(). We should also call disable_kernel_fp(), although it does nothing by default, there is a debug switch to make it active and all enables should be paired with disables.
--- arch/powerpc/crypto/crc32c-vpmsum_glue.c | 3 +++ 1 file changed, 3 insertions(+)
arch/powerpc/crypto/crc32c-vpmsum_glue.c +3 -0
@@ -33,10 +33,13 @@ static u32 crc32c_vpmsum(u32 crc, unsign }if (len & ~VMX_ALIGN_MASK ) { +preempt_disable ();pagefault_disable ();enable_kernel_altivec (); crc =__crc32c_vpmsum (crc, p, len & ~VMX_ALIGN_MASK ); +disable_kernel_altivec ();pagefault_enable (); +preempt_enable (); } tail = len &VMX_ALIGN_MASK ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/powerpc-disable-hfscr-if-tm-is-not-supported.patch queue-4.10/powerpc-64-fix-flush_-d-i-cache_range-called-from-modules.patch queue-4.10/powerpc-crypto-crc32c-vpmsum-fix-missing-preempt_disable.patch queue-4.10/powerpc-mm-add-missing-global-tlb-invalidate-if-cxl-is-active.patch queue-4.10/powerpc-don-t-try-to-fix-up-misaligned-load-with-reservation-instructions.patch