tls: Fill software context without allocation
authorBoris Pismenny <borisp@mellanox.com>
Fri, 13 Jul 2018 11:33:42 +0000 (14:33 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Jul 2018 07:13:11 +0000 (00:13 -0700)
This patch allows tls_set_sw_offload to fill the context in case it was
already allocated previously.

We will use it in TLS_DEVICE to fill the RX software context.

Signed-off-by: Boris Pismenny <borisp@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tls/tls_sw.c

index 694d265..5f7d70b 100644 (file)
@@ -1081,28 +1081,38 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
        }
 
        if (tx) {
-               sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
-               if (!sw_ctx_tx) {
-                       rc = -ENOMEM;
-                       goto out;
+               if (!ctx->priv_ctx_tx) {
+                       sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
+                       if (!sw_ctx_tx) {
+                               rc = -ENOMEM;
+                               goto out;
+                       }
+                       ctx->priv_ctx_tx = sw_ctx_tx;
+               } else {
+                       sw_ctx_tx =
+                               (struct tls_sw_context_tx *)ctx->priv_ctx_tx;
                }
-               crypto_init_wait(&sw_ctx_tx->async_wait);
-               ctx->priv_ctx_tx = sw_ctx_tx;
        } else {
-               sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
-               if (!sw_ctx_rx) {
-                       rc = -ENOMEM;
-                       goto out;
+               if (!ctx->priv_ctx_rx) {
+                       sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
+                       if (!sw_ctx_rx) {
+                               rc = -ENOMEM;
+                               goto out;
+                       }
+                       ctx->priv_ctx_rx = sw_ctx_rx;
+               } else {
+                       sw_ctx_rx =
+                               (struct tls_sw_context_rx *)ctx->priv_ctx_rx;
                }
-               crypto_init_wait(&sw_ctx_rx->async_wait);
-               ctx->priv_ctx_rx = sw_ctx_rx;
        }
 
        if (tx) {
+               crypto_init_wait(&sw_ctx_tx->async_wait);
                crypto_info = &ctx->crypto_send;
                cctx = &ctx->tx;
                aead = &sw_ctx_tx->aead_send;
        } else {
+               crypto_init_wait(&sw_ctx_rx->async_wait);
                crypto_info = &ctx->crypto_recv;
                cctx = &ctx->rx;
                aead = &sw_ctx_rx->aead_recv;