crypto: cpt - don't sleep of CRYPTO_TFM_REQ_MAY_SLEEP was not specified
commit9e27c99104
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:c694b23329
("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>
This commit is contained in:
parent
28bd8f392f
commit
3e95a74f4c
|
@ -200,6 +200,7 @@ static inline int cvm_enc_dec(struct ablkcipher_request *req, u32 enc)
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
memset(req_info, 0, sizeof(struct cpt_request_info));
|
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));
|
memset(fctx, 0, sizeof(struct fc_context));
|
||||||
create_input_list(req, enc, enc_iv_len);
|
create_input_list(req, enc, enc_iv_len);
|
||||||
create_output_list(req, enc_iv_len);
|
create_output_list(req, enc_iv_len);
|
||||||
|
|
|
@ -133,7 +133,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
|
||||||
|
|
||||||
/* Setup gather (input) components */
|
/* Setup gather (input) components */
|
||||||
g_sz_bytes = ((req->incnt + 3) / 4) * sizeof(struct sglist_component);
|
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) {
|
if (!info->gather_components) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto scatter_gather_clean;
|
goto scatter_gather_clean;
|
||||||
|
@ -150,7 +150,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
|
||||||
|
|
||||||
/* Setup scatter (output) components */
|
/* Setup scatter (output) components */
|
||||||
s_sz_bytes = ((req->outcnt + 3) / 4) * sizeof(struct sglist_component);
|
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) {
|
if (!info->scatter_components) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto scatter_gather_clean;
|
goto scatter_gather_clean;
|
||||||
|
@ -167,7 +167,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
|
||||||
|
|
||||||
/* Create and initialize DPTR */
|
/* Create and initialize DPTR */
|
||||||
info->dlen = g_sz_bytes + s_sz_bytes + SG_LIST_HDR_SIZE;
|
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) {
|
if (!info->in_buffer) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto scatter_gather_clean;
|
goto scatter_gather_clean;
|
||||||
|
@ -195,7 +195,7 @@ static inline int setup_sgio_list(struct cpt_vf *cptvf,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create and initialize RPTR */
|
/* 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) {
|
if (!info->out_buffer) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto scatter_gather_clean;
|
goto scatter_gather_clean;
|
||||||
|
@ -421,7 +421,7 @@ int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req)
|
||||||
struct cpt_vq_command vq_cmd;
|
struct cpt_vq_command vq_cmd;
|
||||||
union cpt_inst_s cptinst;
|
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)) {
|
if (unlikely(!info)) {
|
||||||
dev_err(&pdev->dev, "Unable to allocate memory for info_buffer\n");
|
dev_err(&pdev->dev, "Unable to allocate memory for info_buffer\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -443,7 +443,7 @@ int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req)
|
||||||
* Get buffer for union cpt_res_s response
|
* Get buffer for union cpt_res_s response
|
||||||
* structure and its physical address
|
* 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)) {
|
if (unlikely(!info->completion_addr)) {
|
||||||
dev_err(&pdev->dev, "Unable to allocate memory for completion_addr\n");
|
dev_err(&pdev->dev, "Unable to allocate memory for completion_addr\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
|
@ -62,6 +62,8 @@ struct cpt_request_info {
|
||||||
union ctrl_info ctrl; /* User control information */
|
union ctrl_info ctrl; /* User control information */
|
||||||
struct cptvf_request req; /* Request Information (Core specific) */
|
struct cptvf_request req; /* Request Information (Core specific) */
|
||||||
|
|
||||||
|
bool may_sleep;
|
||||||
|
|
||||||
struct buf_ptr in[MAX_BUF_CNT];
|
struct buf_ptr in[MAX_BUF_CNT];
|
||||||
struct buf_ptr out[MAX_BUF_CNT];
|
struct buf_ptr out[MAX_BUF_CNT];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue