Reviewed-by: Gaurav Jain <gaurav.jain@xxxxxxx> > -----Original Message----- > From: Meenakshi Aggarwal <meenakshi.aggarwal@xxxxxxx> > Sent: Tuesday, August 8, 2023 4:25 PM > To: Horia Geanta <horia.geanta@xxxxxxx>; Varun Sethi <V.Sethi@xxxxxxx>; > Pankaj Gupta <pankaj.gupta@xxxxxxx>; Gaurav Jain <gaurav.jain@xxxxxxx>; > herbert@xxxxxxxxxxxxxxxxxxx; davem@xxxxxxxxxxxxx; linux- > crypto@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx > Cc: Iuliana Prodan <iuliana.prodan@xxxxxxx>; Meenakshi Aggarwal > <meenakshi.aggarwal@xxxxxxx> > Subject: [PATCH] crypto: caam - increase the domain of write memory barrier to > full system > > From: Iuliana Prodan <iuliana.prodan@xxxxxxx> > > In caam_jr_enqueue, under heavy DDR load, smp_wmb() or dma_wmb() fail to > make the input ring be updated before the CAAM starts reading it. So, CAAM will > process, again, an old descriptor address and will put it in the output ring. This > will make caam_jr_dequeue() to fail, since this old descriptor is not in the > software ring. > To fix this, use wmb() which works on the full system instead of inner/outer > shareable domains. > > Signed-off-by: Iuliana Prodan <iuliana.prodan@xxxxxxx> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@xxxxxxx> > --- > drivers/crypto/caam/jr.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c index > 767fbf052536..5507d5d34a4c 100644 > --- a/drivers/crypto/caam/jr.c > +++ b/drivers/crypto/caam/jr.c > @@ -464,8 +464,16 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, > * Guarantee that the descriptor's DMA address has been written to > * the next slot in the ring before the write index is updated, since > * other cores may update this index independently. > + * > + * Under heavy DDR load, smp_wmb() or dma_wmb() fail to make the > input > + * ring be updated before the CAAM starts reading it. So, CAAM will > + * process, again, an old descriptor address and will put it in the > + * output ring. This will make caam_jr_dequeue() to fail, since this > + * old descriptor is not in the software ring. > + * To fix this, use wmb() which works on the full system instead of > + * inner/outer shareable domains. > */ > - smp_wmb(); > + wmb(); > > jrp->head = (head + 1) & (JOBR_DEPTH - 1); > > -- > 2.25.1