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

crypto: caam - use non-irq versions of spinlocks for job rings

The enqueue lock isn't used in any interrupt context, and
the dequeue lock isn't used in the h/w interrupt context,
only in bh context.

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
4bba1e9f 1a076689

+13 -17
+13 -17
drivers/crypto/caam/jr.c
··· 2 2 * CAAM/SEC 4.x transport/backend driver 3 3 * JobR backend functionality 4 4 * 5 - * Copyright 2008-2011 Freescale Semiconductor, Inc. 5 + * Copyright 2008-2012 Freescale Semiconductor, Inc. 6 6 */ 7 7 8 8 #include "compat.h" ··· 58 58 void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg); 59 59 u32 *userdesc, userstatus; 60 60 void *userarg; 61 - unsigned long flags; 62 61 63 - spin_lock_irqsave(&jrp->outlock, flags); 62 + spin_lock_bh(&jrp->outlock); 64 63 65 64 head = ACCESS_ONCE(jrp->head); 66 65 sw_idx = tail = jrp->tail; ··· 117 118 /* set done */ 118 119 wr_reg32(&jrp->rregs->outring_rmvd, 1); 119 120 120 - spin_unlock_irqrestore(&jrp->outlock, flags); 121 + spin_unlock_bh(&jrp->outlock); 121 122 122 123 /* Finally, execute user's callback */ 123 124 usercall(dev, userdesc, userstatus, userarg); 124 125 125 - spin_lock_irqsave(&jrp->outlock, flags); 126 + spin_lock_bh(&jrp->outlock); 126 127 127 128 head = ACCESS_ONCE(jrp->head); 128 129 sw_idx = tail = jrp->tail; 129 130 } 130 131 131 - spin_unlock_irqrestore(&jrp->outlock, flags); 132 + spin_unlock_bh(&jrp->outlock); 132 133 133 134 /* reenable / unmask IRQs */ 134 135 clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK); ··· 147 148 { 148 149 struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev); 149 150 struct caam_drv_private_jr *jrpriv = NULL; 150 - unsigned long flags; 151 151 int ring; 152 152 153 153 /* Lock, if free ring - assign, unlock */ 154 - spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); 154 + spin_lock(&ctrlpriv->jr_alloc_lock); 155 155 for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) { 156 156 jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]); 157 157 if (jrpriv->assign == JOBR_UNASSIGNED) { 158 158 jrpriv->assign = JOBR_ASSIGNED; 159 159 *rdev = ctrlpriv->jrdev[ring]; 160 - spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 160 + spin_unlock(&ctrlpriv->jr_alloc_lock); 161 161 return ring; 162 162 } 163 163 } 164 164 165 165 /* If assigned, write dev where caller needs it */ 166 - spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 166 + spin_unlock(&ctrlpriv->jr_alloc_lock); 167 167 *rdev = NULL; 168 168 169 169 return -ENODEV; ··· 180 182 { 181 183 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev); 182 184 struct caam_drv_private *ctrlpriv; 183 - unsigned long flags; 184 185 185 186 /* Get the owning controller's private space */ 186 187 ctrlpriv = dev_get_drvdata(jrpriv->parentdev); ··· 192 195 return -EBUSY; 193 196 194 197 /* Release ring */ 195 - spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); 198 + spin_lock(&ctrlpriv->jr_alloc_lock); 196 199 jrpriv->assign = JOBR_UNASSIGNED; 197 - spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 200 + spin_unlock(&ctrlpriv->jr_alloc_lock); 198 201 199 202 return 0; 200 203 } ··· 235 238 { 236 239 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); 237 240 struct caam_jrentry_info *head_entry; 238 - unsigned long flags; 239 241 int head, tail, desc_size; 240 242 dma_addr_t desc_dma; 241 243 ··· 245 249 return -EIO; 246 250 } 247 251 248 - spin_lock_irqsave(&jrp->inplock, flags); 252 + spin_lock(&jrp->inplock); 249 253 250 254 head = jrp->head; 251 255 tail = ACCESS_ONCE(jrp->tail); 252 256 253 257 if (!rd_reg32(&jrp->rregs->inpring_avail) || 254 258 CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { 255 - spin_unlock_irqrestore(&jrp->inplock, flags); 259 + spin_unlock(&jrp->inplock); 256 260 dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); 257 261 return -EBUSY; 258 262 } ··· 276 280 277 281 wr_reg32(&jrp->rregs->inpring_jobadd, 1); 278 282 279 - spin_unlock_irqrestore(&jrp->inplock, flags); 283 + spin_unlock(&jrp->inplock); 280 284 281 285 return 0; 282 286 }