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. Cc: <stable@vger.kernel.org> # v4.12+ Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
||
|---|---|---|
| .. | ||
| 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 | ||
| Makefile | ||
| mpi-bit.c | ||
| mpi-cmp.c | ||
| mpi-inline.h | ||
| mpi-internal.h | ||
| mpi-pow.c | ||
| mpicoder.c | ||
| mpih-cmp.c | ||
| mpih-div.c | ||
| mpih-mul.c | ||
| mpiutil.c | ||