* Nicolas Pitre | 2009-06-11 17:19:22 [-0400]: >> >What is your plan for this driver? Submit it now and add incremental >> >improvements afterward or wait until it is more functional? >> I would like to get it squeezed into this merge window unless there are >> any objections and improve it afterwards. >> If you thing it is too early I can keep hacking in my own git tree until >> I get the dmac_flush_range() hack out or so. > >I have no problem with you submitting it now. It is not complete yet >but what is there is plenty functional. However I'd prefer if you used >the API based on sg_copy_buffer() which includes a call to >flush_kernel_dcache_page() already for mainline inclusion, so to have >good style up front. ( a patch to fix flush_kernel_dcache_page() on ARM >is already queued). sg_copy_from_buffer() since the other one is static. I'm little unhappy with it because this forces me to have the entire buffer "ready". This is not a problem for dm-crypt because I get just one scatterlist entry with 512 bytes. I don't know about others but this will put a limitation / break them.
It looks like sg_miter_start() which is exported doesn't provide the the required flush interface. What about: --- a/drivers/crypto/mv_cesa.c +++ b/drivers/crypto/mv_cesa.c @@ -259,12 +259,6 @@ static void dequeue_complete_req(void) dst_copy = min(cpg->p.crypt_len, cpg->p.sg_dst_left); memcpy(buf, cpg->sram + SRAM_DATA_OUT_START, dst_copy); - /* - * XXX This is a temporary hack to flush data from cache back - * into phys ram so user space sees correct data. This goes - * away as soon as DMA support is added to this driver - */ - dmac_flush_range(buf, buf + dst_copy); cpg->p.sg_dst_left -= dst_copy; cpg->p.crypt_len -= dst_copy; @@ -309,7 +303,7 @@ static void mv_enqueue_new_req(struct ablkcipher_request *req) sg_miter_start(&cpg->p.src_sg_it, req->src, num_sgs, 0); num_sgs = count_sgs(req->dst, req->nbytes); - sg_miter_start(&cpg->p.dst_sg_it, req->dst, num_sgs, 0); + sg_miter_start(&cpg->p.dst_sg_it, req->dst, num_sgs, SG_MITER_FLUSH_CACHE); mv_process_current_q(1); } diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index e599698..8f98450 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -242,6 +242,7 @@ size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents, */ #define SG_MITER_ATOMIC (1 << 0) /* use kmap_atomic */ +#define SG_MITER_FLUSH_CACHE (1 << 1) /* flash cache on unmap */ struct sg_mapping_iter { /* the following three fields can be accessed directly */ diff --git a/lib/scatterlist.c b/lib/scatterlist.c index a295e40..4b07f7a 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -394,6 +394,9 @@ void sg_miter_stop(struct sg_mapping_iter *miter) if (miter->addr) { miter->__offset += miter->consumed; + if (miter->__flags & SG_MITER_FLUSH_CACHE) + flush_kernel_dcache_page(miter->page); + if (miter->__flags & SG_MITER_ATOMIC) { WARN_ON(!irqs_disabled()); kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); -- 1.6.0.6 > > >Nicolas Sebastian -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html