crypto: caam - one tasklet per job ring
authorKim Phillips <kim.phillips@freescale.com>
Sat, 23 Jun 2012 00:48:57 +0000 (19:48 -0500)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 27 Jun 2012 06:42:07 +0000 (14:42 +0800)
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>
drivers/crypto/caam/intern.h
drivers/crypto/caam/jr.c

index ed2b739f934bf68f81d433042b61715bd4022747..5cd4c1b268a1ec18c4d81d3eee0004a59eba5a36 100644 (file)
@@ -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 */
 
index 0adaad1b8cf719576fadc5c01966643d0dc94bfc..7074a1a29e8bf9dbca72dad5eb67103b15697a66 100644 (file)
@@ -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;
@@ -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) {
@@ -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);