diff options
Diffstat (limited to 'drivers/crypto')
| -rw-r--r-- | drivers/crypto/hisilicon/sec/sec_algs.c | 31 | 
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/crypto/hisilicon/sec/sec_algs.c b/drivers/crypto/hisilicon/sec/sec_algs.c index f7d6d690116e..cdc4f9a171d9 100644 --- a/drivers/crypto/hisilicon/sec/sec_algs.c +++ b/drivers/crypto/hisilicon/sec/sec_algs.c @@ -732,6 +732,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  	int *splits_in_nents;  	int *splits_out_nents = NULL;  	struct sec_request_el *el, *temp; +	bool split = skreq->src != skreq->dst;  	mutex_init(&sec_req->lock);  	sec_req->req_base = &skreq->base; @@ -750,7 +751,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  	if (ret)  		goto err_free_split_sizes; -	if (skreq->src != skreq->dst) { +	if (split) {  		sec_req->len_out = sg_nents(skreq->dst);  		ret = sec_map_and_split_sg(skreq->dst, split_sizes, steps,  					   &splits_out, &splits_out_nents, @@ -785,8 +786,9 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  					       split_sizes[i],  					       skreq->src != skreq->dst,  					       splits_in[i], splits_in_nents[i], -					       splits_out[i], -					       splits_out_nents[i], info); +					       split ? splits_out[i] : NULL, +					       split ? splits_out_nents[i] : 0, +					       info);  		if (IS_ERR(el)) {  			ret = PTR_ERR(el);  			goto err_free_elements; @@ -806,13 +808,6 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  	 * more refined but this is unlikely to happen so no need.  	 */ -	/* Cleanup - all elements in pointer arrays have been coppied */ -	kfree(splits_in_nents); -	kfree(splits_in); -	kfree(splits_out_nents); -	kfree(splits_out); -	kfree(split_sizes); -  	/* Grab a big lock for a long time to avoid concurrency issues */  	mutex_lock(&queue->queuelock); @@ -827,13 +822,13 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  	     (!queue->havesoftqueue ||  	      kfifo_avail(&queue->softqueue) > steps)) ||  	    !list_empty(&ctx->backlog)) { +		ret = -EBUSY;  		if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {  			list_add_tail(&sec_req->backlog_head, &ctx->backlog);  			mutex_unlock(&queue->queuelock); -			return -EBUSY; +			goto out;  		} -		ret = -EBUSY;  		mutex_unlock(&queue->queuelock);  		goto err_free_elements;  	} @@ -842,7 +837,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,  	if (ret)  		goto err_free_elements; -	return -EINPROGRESS; +	ret = -EINPROGRESS; +out: +	/* Cleanup - all elements in pointer arrays have been copied */ +	kfree(splits_in_nents); +	kfree(splits_in); +	kfree(splits_out_nents); +	kfree(splits_out); +	kfree(split_sizes); +	return ret;  err_free_elements:  	list_for_each_entry_safe(el, temp, &sec_req->elements, head) { @@ -854,7 +857,7 @@ err_free_elements:  				 crypto_skcipher_ivsize(atfm),  				 DMA_BIDIRECTIONAL);  err_unmap_out_sg: -	if (skreq->src != skreq->dst) +	if (split)  		sec_unmap_sg_on_err(skreq->dst, steps, splits_out,  				    splits_out_nents, sec_req->len_out,  				    info->dev);  | 
