All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations
@ 2019-03-05 18:03 Vakul Garg
  2019-03-05 18:34 ` Horia Geanta
  2019-03-22 13:02 ` Herbert Xu
  0 siblings, 2 replies; 3+ messages in thread
From: Vakul Garg @ 2019-03-05 18:03 UTC (permalink / raw)
  To: linux-crypto; +Cc: Horia Geanta, Aymen Sghaier, herbert, davem, Vakul Garg

Instead of reading job ring's occupancy registers for every req/rsp
enqueued/dequeued respectively, we read these registers once and store
them in memory. After completing a job enqueue/dequeue, we decrement
these values. When these values become zero, we refresh the snapshot of
job ring's occupancy registers. This eliminates need of expensive device
register read operations for every job enqueued and dequeued and hence
makes caam_jr_enqueue() and caam_jr_dequeue() faster. The performance of
kernel ipsec improved by about 6% on ls1028 (for frame size 408 bytes).

Signed-off-by: Vakul Garg <vakul.garg@nxp.com>
---

Changes since v2:
	- Added magnitude of performance improvement in commit log.

 drivers/crypto/caam/intern.h |  1 +
 drivers/crypto/caam/jr.c     | 12 ++++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h
index 5869ad58d497..30d5b6c5892f 100644
--- a/drivers/crypto/caam/intern.h
+++ b/drivers/crypto/caam/intern.h
@@ -53,6 +53,7 @@ struct caam_drv_private_jr {
 	struct caam_jrentry_info *entinfo;	/* Alloc'ed 1 per ring entry */
 	spinlock_t inplock ____cacheline_aligned; /* Input ring index lock */
 	int inp_ring_write_index;	/* Input index "tail" */
+	u32 inpring_avail;	/* Number of free entries in input ring */
 	int head;			/* entinfo (s/w ring) head index */
 	dma_addr_t *inpring;	/* Base of input ring, alloc DMA-safe */
 	spinlock_t outlock ____cacheline_aligned; /* Output ring index lock */
diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c
index d50085a03597..b9caa95755d1 100644
--- a/drivers/crypto/caam/jr.c
+++ b/drivers/crypto/caam/jr.c
@@ -170,8 +170,10 @@ static void caam_jr_dequeue(unsigned long devarg)
 	void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg);
 	u32 *userdesc, userstatus;
 	void *userarg;
+	u32 outring_used = 0;
 
-	while (rd_reg32(&jrp->rregs->outring_used)) {
+	while (outring_used ||
+	       (outring_used = rd_reg32(&jrp->rregs->outring_used))) {
 
 		head = READ_ONCE(jrp->head);
 
@@ -236,6 +238,7 @@ static void caam_jr_dequeue(unsigned long devarg)
 
 		/* Finally, execute user's callback */
 		usercall(dev, userdesc, userstatus, userarg);
+		outring_used--;
 	}
 
 	/* reenable / unmask IRQs */
@@ -345,7 +348,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
 	head = jrp->head;
 	tail = READ_ONCE(jrp->tail);
 
-	if (!rd_reg32(&jrp->rregs->inpring_avail) ||
+	if (!jrp->inpring_avail ||
 	    CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) {
 		spin_unlock_bh(&jrp->inplock);
 		dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE);
@@ -380,6 +383,10 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
 
 	wr_reg32(&jrp->rregs->inpring_jobadd, 1);
 
+	jrp->inpring_avail--;
+	if (!jrp->inpring_avail)
+		jrp->inpring_avail = rd_reg32(&jrp->rregs->inpring_avail);
+
 	spin_unlock_bh(&jrp->inplock);
 
 	return 0;
@@ -442,6 +449,7 @@ static int caam_jr_init(struct device *dev)
 	wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH);
 
 	jrp->ringsize = JOBR_DEPTH;
+	jrp->inpring_avail = JOBR_DEPTH;
 
 	spin_lock_init(&jrp->inplock);
 	spin_lock_init(&jrp->outlock);
-- 
2.13.6


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations
  2019-03-05 18:03 [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations Vakul Garg
@ 2019-03-05 18:34 ` Horia Geanta
  2019-03-22 13:02 ` Herbert Xu
  1 sibling, 0 replies; 3+ messages in thread
From: Horia Geanta @ 2019-03-05 18:34 UTC (permalink / raw)
  To: Vakul Garg, linux-crypto; +Cc: Aymen Sghaier, herbert, davem

On 3/5/2019 8:03 PM, Vakul Garg wrote:
> Instead of reading job ring's occupancy registers for every req/rsp
> enqueued/dequeued respectively, we read these registers once and store
> them in memory. After completing a job enqueue/dequeue, we decrement
> these values. When these values become zero, we refresh the snapshot of
> job ring's occupancy registers. This eliminates need of expensive device
> register read operations for every job enqueued and dequeued and hence
> makes caam_jr_enqueue() and caam_jr_dequeue() faster. The performance of
> kernel ipsec improved by about 6% on ls1028 (for frame size 408 bytes).
> 
> Signed-off-by: Vakul Garg <vakul.garg@nxp.com>
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>

Thanks,
Horia

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations
  2019-03-05 18:03 [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations Vakul Garg
  2019-03-05 18:34 ` Horia Geanta
@ 2019-03-22 13:02 ` Herbert Xu
  1 sibling, 0 replies; 3+ messages in thread
From: Herbert Xu @ 2019-03-22 13:02 UTC (permalink / raw)
  To: Vakul Garg; +Cc: linux-crypto, Horia Geanta, Aymen Sghaier, davem

On Tue, Mar 05, 2019 at 06:03:14PM +0000, Vakul Garg wrote:
> Instead of reading job ring's occupancy registers for every req/rsp
> enqueued/dequeued respectively, we read these registers once and store
> them in memory. After completing a job enqueue/dequeue, we decrement
> these values. When these values become zero, we refresh the snapshot of
> job ring's occupancy registers. This eliminates need of expensive device
> register read operations for every job enqueued and dequeued and hence
> makes caam_jr_enqueue() and caam_jr_dequeue() faster. The performance of
> kernel ipsec improved by about 6% on ls1028 (for frame size 408 bytes).
> 
> Signed-off-by: Vakul Garg <vakul.garg@nxp.com>
> ---
> 
> Changes since v2:
> 	- Added magnitude of performance improvement in commit log.
> 
>  drivers/crypto/caam/intern.h |  1 +
>  drivers/crypto/caam/jr.c     | 12 ++++++++++--
>  2 files changed, 11 insertions(+), 2 deletions(-)

Patch applied.  Thanks.
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-03-22 13:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-05 18:03 [PATCH v3] crypto: caam/jr - optimize job ring enqueue and dequeue operations Vakul Garg
2019-03-05 18:34 ` Horia Geanta
2019-03-22 13:02 ` Herbert Xu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.