Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: caam - one tasklet per job ring

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>

authored by

Kim Phillips and committed by
Herbert Xu
a0ca6ca0 14a8e29c

+6 -9
+1 -1
drivers/crypto/caam/intern.h
··· 43 43 struct device *parentdev; /* points back to controller dev */ 44 44 int ridx; 45 45 struct caam_job_ring __iomem *rregs; /* JobR's register space */ 46 - struct tasklet_struct irqtask[NR_CPUS]; 46 + struct tasklet_struct irqtask; 47 47 int irq; /* One per queue */ 48 48 int assign; /* busy/free */ 49 49
+5 -8
drivers/crypto/caam/jr.c
··· 43 43 wr_reg32(&jrp->rregs->jrintstatus, irqstate); 44 44 45 45 preempt_disable(); 46 - tasklet_schedule(&jrp->irqtask[smp_processor_id()]); 46 + tasklet_schedule(&jrp->irqtask); 47 47 preempt_enable(); 48 48 49 49 return IRQ_HANDLED; ··· 322 322 323 323 jrp = dev_get_drvdata(dev); 324 324 325 - /* Connect job ring interrupt handler. */ 326 - for_each_possible_cpu(i) 327 - tasklet_init(&jrp->irqtask[i], caam_jr_dequeue, 328 - (unsigned long)dev); 325 + tasklet_init(&jrp->irqtask, caam_jr_dequeue, (unsigned long)dev); 329 326 327 + /* Connect job ring interrupt handler. */ 330 328 error = request_irq(jrp->irq, caam_jr_interrupt, IRQF_SHARED, 331 329 "caam-jobr", dev); 332 330 if (error) { ··· 414 416 { 415 417 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); 416 418 dma_addr_t inpbusaddr, outbusaddr; 417 - int ret, i; 419 + int ret; 418 420 419 421 ret = caam_reset_hw_jr(dev); 420 422 421 - for_each_possible_cpu(i) 422 - tasklet_kill(&jrp->irqtask[i]); 423 + tasklet_kill(&jrp->irqtask); 423 424 424 425 /* Release interrupt */ 425 426 free_irq(jrp->irq, dev);