Commit a0ca6ca022ac197e159bb5d22a08e3c3aebb242c

Authored by Kim Phillips
Committed by Herbert Xu
1 parent 14a8e29cc2

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>

Showing 2 changed files with 6 additions and 9 deletions Side-by-side Diff

drivers/crypto/caam/intern.h
... ... @@ -43,7 +43,7 @@
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  
drivers/crypto/caam/jr.c
... ... @@ -43,7 +43,7 @@
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;
50 50  
... ... @@ -322,11 +322,9 @@
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) {
333 331  
... ... @@ -416,12 +414,11 @@
416 414 {
417 415 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
418 416 dma_addr_t inpbusaddr, outbusaddr;
419   - int ret, i;
  417 + int ret;
420 418  
421 419 ret = caam_reset_hw_jr(dev);
422 420  
423   - for_each_possible_cpu(i)
424   - tasklet_kill(&jrp->irqtask[i]);
  421 + tasklet_kill(&jrp->irqtask);
425 422  
426 423 /* Release interrupt */
427 424 free_irq(jrp->irq, dev);