]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
crypto: cpt - don't sleep of CRYPTO_TFM_REQ_MAY_SLEEP was not specified
authorMikulas Patocka <mpatocka@redhat.com>
Wed, 17 Jun 2020 13:48:56 +0000 (09:48 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Aug 2020 07:48:14 +0000 (09:48 +0200)
commit 9e27c99104707f083dccd3b4d79762859b5a0614 upstream.

There is this call chain:
cvm_encrypt -> cvm_enc_dec -> cptvf_do_request -> process_request -> kzalloc
where we call sleeping allocator function even if CRYPTO_TFM_REQ_MAY_SLEEP
was not specified.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org # v4.11+
Fixes: c694b233295b ("crypto: cavium - Add the Virtual Function driver for CPT")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/crypto/cavium/cpt/cptvf_algs.c
drivers/crypto/cavium/cpt/cptvf_reqmanager.c
drivers/crypto/cavium/cpt/request_manager.h

index df21d996db7edb9a0142f994763b0759024d3e30..2d1b28c29a8e57444a821d86bcea4dbf095ef863 100644 (file)
@@ -205,6 +205,7 @@ static inline int cvm_enc_dec(struct ablkcipher_request *req, u32 enc)
        int status;
 
        memset(req_info, 0, sizeof(struct cpt_request_info));
+       req_info->may_sleep = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) != 0;
        memset(fctx, 0, sizeof(struct fc_context));
        create_input_list(req, enc, enc_iv_len);
        create_output_list(req, enc_iv_len);
index b0ba4331944b52b9093636e13b88b3e071ae182b..43fe69d0981acfea3c4efba583113aaff06a5245 100644 (file)
@@ -136,7 +136,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
 
        /* Setup gather (input) components */
        g_sz_bytes = ((req->incnt + 3) / 4) * sizeof(struct sglist_component);
-       info->gather_components = kzalloc(g_sz_bytes, GFP_KERNEL);
+       info->gather_components = kzalloc(g_sz_bytes, req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (!info->gather_components) {
                ret = -ENOMEM;
                goto  scatter_gather_clean;
@@ -153,7 +153,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
 
        /* Setup scatter (output) components */
        s_sz_bytes = ((req->outcnt + 3) / 4) * sizeof(struct sglist_component);
-       info->scatter_components = kzalloc(s_sz_bytes, GFP_KERNEL);
+       info->scatter_components = kzalloc(s_sz_bytes, req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (!info->scatter_components) {
                ret = -ENOMEM;
                goto  scatter_gather_clean;
@@ -170,7 +170,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
 
        /* Create and initialize DPTR */
        info->dlen = g_sz_bytes + s_sz_bytes + SG_LIST_HDR_SIZE;
-       info->in_buffer = kzalloc(info->dlen, GFP_KERNEL);
+       info->in_buffer = kzalloc(info->dlen, req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (!info->in_buffer) {
                ret = -ENOMEM;
                goto  scatter_gather_clean;
@@ -198,7 +198,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
        }
 
        /* Create and initialize RPTR */
-       info->out_buffer = kzalloc(COMPLETION_CODE_SIZE, GFP_KERNEL);
+       info->out_buffer = kzalloc(COMPLETION_CODE_SIZE, req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (!info->out_buffer) {
                ret = -ENOMEM;
                goto scatter_gather_clean;
@@ -434,7 +434,7 @@ int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req)
        struct cpt_vq_command vq_cmd;
        union cpt_inst_s cptinst;
 
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       info = kzalloc(sizeof(*info), req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (unlikely(!info)) {
                dev_err(&pdev->dev, "Unable to allocate memory for info_buffer\n");
                return -ENOMEM;
@@ -456,7 +456,7 @@ int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req)
         * Get buffer for union cpt_res_s response
         * structure and its physical address
         */
-       info->completion_addr = kzalloc(sizeof(union cpt_res_s), GFP_KERNEL);
+       info->completion_addr = kzalloc(sizeof(union cpt_res_s), req->may_sleep ? GFP_KERNEL : GFP_ATOMIC);
        if (unlikely(!info->completion_addr)) {
                dev_err(&pdev->dev, "Unable to allocate memory for completion_addr\n");
                ret = -ENOMEM;
index 80ee074c6e0cbec33762c59bd79ef57449351afb..09930d95ad24be22a13a9abd78a0e76ca3d6a325 100644 (file)
@@ -65,6 +65,8 @@ struct cpt_request_info {
        union ctrl_info ctrl; /* User control information */
        struct cptvf_request req; /* Request Information (Core specific) */
 
+       bool may_sleep;
+
        struct buf_ptr in[MAX_BUF_CNT];
        struct buf_ptr out[MAX_BUF_CNT];