• Daniel Jordan's avatar
    padata: validate cpumask without removed CPU during offline · 894c9ef9
    Daniel Jordan authored
    Configuring an instance's parallel mask without any online CPUs...
    
      echo 2 > /sys/kernel/pcrypt/pencrypt/parallel_cpumask
      echo 0 > /sys/devices/system/cpu/cpu1/online
    
    ...makes tcrypt mode=215 crash like this:
    
      divide error: 0000 [#1] SMP PTI
      CPU: 4 PID: 283 Comm: modprobe Not tainted 5.4.0-rc8-padata-doc-v2+ #2
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20191013_105130-anatol 04/01/2014
      RIP: 0010:padata_do_parallel+0x114/0x300
      Call Trace:
       pcrypt_aead_encrypt+0xc0/0xd0 [pcrypt]
       crypto_aead_encrypt+0x1f/0x30
       do_mult_aead_op+0x4e/0xdf [tcrypt]
       test_mb_aead_speed.constprop.0.cold+0x226/0x564 [tcrypt]
       do_test+0x28c2/0x4d49 [tcrypt]
       tcrypt_mod_init+0x55/0x1000 [tcrypt]
       ...
    
    cpumask_weight() in padata_cpu_hash() returns 0 because the mask has no
    CPUs.  The problem is __padata_remove_cpu() checks for valid masks too
    early and so doesn't mark the instance PADATA_INVALID as expected, which
    would have made padata_do_parallel() return error before doing the
    division.
    
    Fix by introducing a second padata CPU hotplug state before
    CPUHP_BRINGUP_CPU so that __padata_remove_cpu() sees the online mask
    without @cpu.  No need for the second argument to padata_replace() since
    @cpu is now already missing from the online mask.
    
    Fixes: 33e54450 ("padata: Handle empty padata cpumasks")
    Signed-off-by: default avatarDaniel Jordan <daniel.m.jordan@oracle.com>
    Cc: Eric Biggers <ebiggers@kernel.org>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-crypto@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    894c9ef9
padata.c 27.5 KB