Message ID | 1426266922-31679-1-git-send-email-horia.geanta@freescale.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Herbert Xu |
Headers | show |
From: Horia Geanta <horia.geanta@freescale.com> Date: Fri, 13 Mar 2015 19:15:22 +0200 > Some crypto backends might require the requests' private contexts > to be allocated in DMA-able memory. > > Signed-off-by: Horia Geanta <horia.geanta@freescale.com> No way. Upper layers should be absolutely not required to know about such requirements. Such details _must_ be hidden inside of the crypto layer and drivers and not leak out into the users of the crypto interfaces. -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 3/13/2015 9:46 PM, David Miller wrote: > From: Horia Geanta <horia.geanta@freescale.com> > Date: Fri, 13 Mar 2015 19:15:22 +0200 > >> Some crypto backends might require the requests' private contexts >> to be allocated in DMA-able memory. >> >> Signed-off-by: Horia Geanta <horia.geanta@freescale.com> > > No way. > > Upper layers should be absolutely not required to know about such > requirements. > > Such details _must_ be hidden inside of the crypto layer and drivers > and not leak out into the users of the crypto interfaces. If you look at patch 1/4: http://www.mail-archive.com/linux-crypto@vger.kernel.org/msg13428.html that's what's done for {aead,ablkcipher,ahash}_request_alloc(). Thus users (upper layers) that allocate the crypto requests using the crypto API are unaware of the requirement. However, ESP is not using aead_request_alloc(). This breaks the interface and thus some crypto implementation details are not transparent. -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Horia Geant? <horia.geanta@freescale.com> Date: Sat, 14 Mar 2015 14:16:37 +0200 > However, ESP is not using aead_request_alloc(). Then find a way to adjust it to do so. -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 60173d4d3a0e..3e6ddece0cbe 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -38,6 +38,7 @@ static u32 esp4_get_mtu(struct xfrm_state *x, int mtu); static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqhilen) { unsigned int len; + gfp_t gfp = GFP_ATOMIC; len = seqhilen; @@ -54,7 +55,11 @@ static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqhilen) 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 __be32 *esp_tmp_seqhi(void *tmp) diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index e48f2c7c5c59..0d173eedad4e 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -65,6 +65,7 @@ static u32 esp6_get_mtu(struct xfrm_state *x, int mtu); static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqihlen) { unsigned int len; + gfp_t gfp = GFP_ATOMIC; len = seqihlen; @@ -81,7 +82,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 __be32 *esp_tmp_seqhi(void *tmp)
Some crypto backends might require the requests' private contexts to be allocated in DMA-able memory. Signed-off-by: Horia Geanta <horia.geanta@freescale.com> --- Depends on patch 1/4 (sent only on crypto list) that adds the CRYPTO_TFM_REQ_DMA flag. net/ipv4/esp4.c | 7 ++++++- net/ipv6/esp6.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-)