Skip to content

Commit

Permalink
crypto: caam - one tasklet per job ring
Browse files Browse the repository at this point in the history
there is no noticeable benefit for multiple cores to process one
job ring's output ring: in fact, we can benefit from cache effects
of having the back-half stay on the core that receives a particular
ring's interrupts, and further relax general contention and the
locking involved with reading outring_used, since tasklets run
atomically.

Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Kim Phillips authored and Herbert Xu committed Jun 27, 2012
1 parent 14a8e29 commit a0ca6ca
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 9 deletions.
2 changes: 1 addition & 1 deletion drivers/crypto/caam/intern.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ struct caam_drv_private_jr {
struct device *parentdev; /* points back to controller dev */
int ridx;
struct caam_job_ring __iomem *rregs; /* JobR's register space */
struct tasklet_struct irqtask[NR_CPUS];
struct tasklet_struct irqtask;
int irq; /* One per queue */
int assign; /* busy/free */

Expand Down
13 changes: 5 additions & 8 deletions drivers/crypto/caam/jr.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ static irqreturn_t caam_jr_interrupt(int irq, void *st_dev)
wr_reg32(&jrp->rregs->jrintstatus, irqstate);

preempt_disable();
tasklet_schedule(&jrp->irqtask[smp_processor_id()]);
tasklet_schedule(&jrp->irqtask);
preempt_enable();

return IRQ_HANDLED;
Expand Down Expand Up @@ -322,11 +322,9 @@ static int caam_jr_init(struct device *dev)

jrp = dev_get_drvdata(dev);

/* Connect job ring interrupt handler. */
for_each_possible_cpu(i)
tasklet_init(&jrp->irqtask[i], caam_jr_dequeue,
(unsigned long)dev);
tasklet_init(&jrp->irqtask, caam_jr_dequeue, (unsigned long)dev);

/* Connect job ring interrupt handler. */
error = request_irq(jrp->irq, caam_jr_interrupt, IRQF_SHARED,
"caam-jobr", dev);
if (error) {
Expand Down Expand Up @@ -416,12 +414,11 @@ int caam_jr_shutdown(struct device *dev)
{
struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
dma_addr_t inpbusaddr, outbusaddr;
int ret, i;
int ret;

ret = caam_reset_hw_jr(dev);

for_each_possible_cpu(i)
tasklet_kill(&jrp->irqtask[i]);
tasklet_kill(&jrp->irqtask);

/* Release interrupt */
free_irq(jrp->irq, dev);
Expand Down

0 comments on commit a0ca6ca

Please sign in to comment.