天天看點

linux傳輸檔案到linux速度慢,linux中往nand(jffs2)中拷貝檔案時速度慢的問題

最近在調試nand和jffs2時,發現将一個檔案從SD卡拷貝到jffs2的NAND分區時,速度非常慢,和從NAND中拷出(例如拷貝到SD卡)相比,慢了近5倍。一開始以為是驅動寫NAND和讀NAND的差異,後來用mtd-utile的nand write測試了一下,nand write的速度和nand read的也差不多。

由于mtd-utile的nand write/ nand read沒有經過jffs2檔案系統,于是将疑點定位在jffs2檔案中。

經過一番debug,對各個子產品進行耗時統計,經于找到元兇:fs/jffs2/compr.c 中的jffs2_comress()函數,絕大部分多出的耗時全在這個函數裡。原來在menuconfig的時候沒有選擇 Advanced compression option for JFFS2, 但裡面确預設使用了priority的壓縮方式。重新設定成no compression後,OK,速度正常了。

以下是往jffs2檔案系統中copy時的調用流程(竟然沒有走mtdblock.c檔案,一開始以為是經過這個檔案中的mtd->write函數指針調用到nand_write函數的):

fs/read_write.c      do_sync_write -> filp->f_op->aio_write()

jf/jffs2/file.c           .aio_write = generic_file_aio_write,

mm/filemap.c:        generic_file_aio_write->

__generic_file_aio_write ->

generic_file_buffered_write->

generic_perform_write->a_ops->write_end()

fs/jffs2/file.c:        .write_end = jffs2_write_end,

jffs2_write_end->

fs/jffs2/write.c:           jffs2_write_inode_range->

jffs2_write_dnode->

fs/jffs2/wbuf.c:                         jffs2_flash_writev->

c->mtd->write()

__jffs2_flush_wbuf()->

c->mtd->write()

drivers/mtd/nand/nand_base.c:

mtd->write = nand_write;