Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: virtio - Replace GFP_ATOMIC with GFP_KERNEL in __virtio_crypto_ablkcipher_do_req()

__virtio_crypto_ablkcipher_do_req() is never called in atomic context.

__virtio_crypto_ablkcipher_do_req() is only called by
virtio_crypto_ablkcipher_crypt_req(), which is only called by
virtcrypto_find_vqs() that is never called in atomic context.

__virtio_crypto_ablkcipher_do_req() calls kzalloc_node() with GFP_ATOMIC,
which is not necessary.
GFP_ATOMIC can be replaced with GFP_KERNEL.

This is found by a static analysis tool named DCNS written by myself.
I also manually check the kernel code before reporting it.

Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Jia-Ju Bai and committed by
Herbert Xu
f6adeef7 8e8c0386

+2 -2
+2 -2
drivers/crypto/virtio/virtio_crypto_algs.c
··· 383 383 384 384 /* Why 3? outhdr + iv + inhdr */ 385 385 sg_total = src_nents + dst_nents + 3; 386 - sgs = kcalloc_node(sg_total, sizeof(*sgs), GFP_ATOMIC, 386 + sgs = kcalloc_node(sg_total, sizeof(*sgs), GFP_KERNEL, 387 387 dev_to_node(&vcrypto->vdev->dev)); 388 388 if (!sgs) 389 389 return -ENOMEM; 390 390 391 - req_data = kzalloc_node(sizeof(*req_data), GFP_ATOMIC, 391 + req_data = kzalloc_node(sizeof(*req_data), GFP_KERNEL, 392 392 dev_to_node(&vcrypto->vdev->dev)); 393 393 if (!req_data) { 394 394 kfree(sgs);