From: Iuliana Prodan <iuliana.prodan@xxxxxxx> Some crypto backends might require the requests' private contexts to be allocated in DMA-able memory. Signed-off-by: Horia Geanta <horia.geanta@xxxxxxx> --- net/ipv4/esp4.c | 7 ++++++- net/ipv6/esp6.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 8b07f3a4f2db..9edfb1012c3d 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -46,6 +46,7 @@ struct esp_output_extra { static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int extralen) { unsigned int len; + gfp_t gfp = GFP_ATOMIC; len = extralen; @@ -62,7 +63,11 @@ static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int extralen) len += sizeof(struct scatterlist) * nfrags; - return kmalloc(len, GFP_ATOMIC); + if (crypto_aead_reqsize(aead) && + (crypto_aead_get_flags(aead) & CRYPTO_TFM_REQ_DMA)) + gfp |= GFP_DMA; + + return kmalloc(len, gfp); } static inline void *esp_tmp_extra(void *tmp) diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 52c2f063529f..e9125e1234b5 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -63,6 +63,7 @@ struct esp_output_extra { static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqihlen) { unsigned int len; + gfp_t gfp = GFP_ATOMIC; len = seqihlen; @@ -79,7 +80,11 @@ static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqihlen) len += sizeof(struct scatterlist) * nfrags; - return kmalloc(len, GFP_ATOMIC); + if (crypto_aead_reqsize(aead) && + (crypto_aead_get_flags(aead) & CRYPTO_TFM_REQ_DMA)) + gfp |= GFP_DMA; + + return kmalloc(len, gfp); } static inline void *esp_tmp_extra(void *tmp) -- 2.17.1