android_kernel_oneplus_msm8998/lib/mpi
Eric Biggers 4fdb1637b2 lib/mpi: call cond_resched() from mpi_powm() loop
commit 1d9ddde12e3c9bab7f3d3484eb9446315e3571ca upstream.

On a non-preemptible kernel, if KEYCTL_DH_COMPUTE is called with the
largest permitted inputs (16384 bits), the kernel spends 10+ seconds
doing modular exponentiation in mpi_powm() without rescheduling.  If all
threads do it, it locks up the system.  Moreover, it can cause
rcu_sched-stall warnings.

Notwithstanding the insanity of doing this calculation in kernel mode
rather than in userspace, fix it by calling cond_resched() as each bit
from the exponent is processed.  It's still noninterruptible, but at
least it's preemptible now.

Do the cond_resched() once per bit rather than once per MPI limb because
each limb might still easily take 100+ milliseconds on slow CPUs.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-30 08:37:19 +00:00
..
generic_mpih-add1.c
generic_mpih-lshift.c
generic_mpih-mul1.c
generic_mpih-mul2.c
generic_mpih-mul3.c
generic_mpih-rshift.c
generic_mpih-sub1.c
longlong.h move count_zeroes.h out of asm-generic 2015-10-15 00:21:07 +02:00
Makefile
mpi-bit.c
mpi-cmp.c MPILIB: Fix comparison of negative MPIs 2015-01-14 16:10:12 +00:00
mpi-inline.h
mpi-internal.h MPILIB: Fix obvious but harmless typo 2015-01-14 15:16:00 +00:00
mpi-pow.c lib/mpi: call cond_resched() from mpi_powm() loop 2017-11-30 08:37:19 +00:00
mpicoder.c lib/mpi: mpi_write_sgl(): fix skipping of leading zero limbs 2016-09-15 08:27:54 +02:00
mpih-cmp.c
mpih-div.c
mpih-mul.c
mpiutil.c MPILIB: add mpi_read_buf() and mpi_get_size() helpers 2015-06-16 14:35:06 +08:00