mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
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>
This commit is contained in:
parent
14a8e29cc2
commit
a0ca6ca022
2 changed files with 6 additions and 9 deletions
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue