Investigate performance of eMMC storage, fix as needed

Registered by Loïc Minier on 2010-09-28

Investigate the performance of eMMC storage on Linux on ARM, including filesystem issues as well as eMMC device issues
NO SESSION REQUIRED

Blueprint information

Status:
Complete
Approver:
Paul McKenney
Priority:
High
Drafter:
Per Förlin
Direction:
Needs approval
Assignee:
Per Förlin
Definition:
Obsolete
Series goal:
Accepted for 11.05
Implementation:
Started
Milestone target:
None
Started by
Paul McKenney on 2010-12-14
Completed by
Deepak Saxena on 2012-09-17

Related branches

Sprints

Whiteboard

Work items (eMMC Prestudy):
[per-forlin] Read up on JEDEC eMMC 4.41: DONE
[per-forlin] Read up on http://www.spinics.net/lists/linux-mmc/msg04642.htm about BG and HPI patches: DONE
[arnd-arndb] Read up on what is the preferred FS characteristic for SD/MMC: DONE
[per-forlin] Read up on the expected life time for eMMC: DONE
[per-forlin] Read up on the expected performance drop over time due to bad block handling and write amplification: DONE

Work items (Detect eMMC support):
[per-forlin] Read up on how MMC framework detects what the card supports: DONE
[per-forlin] Add support in the MMC framework for detecting reliable write: POSTPONE
[per-forlin] Apply patches to support in the MMC framework for detecting High Priority Interrupts (HPI) and verify: DONE
[per-forlin] Add debug print to output the new EXT_CSD info at MMC init(): DONE

Work items (1. Write performance drop):
[per-forlin] Enable and test MMC_CAP_ERASE for mmci.: DONE
[per-forlin] Test trim support for mmci and compatible MMC card, verify using mmc_test: DONE
[per-forlin] Fix TRIM related bugs. Sometimes the mmci driver hangs, could be timing issue due to trim.: DONE
[per-forlin] Read up on the current algorithm for erase and trim in ext4: POSTPONE
[per-forlin] Write test cases on FS-level using small write, less than erase block size, to verify the benefit of TRIM: DONE
[per-forlin] Compare performance for ext4 with TRIM and without.: DONE
[per-forlin] Compare performance for ext4 TRIM, with BG and without BG.: POSTPONE
[per-forlin] Apply patches to support in the MMC framework for detecting bg-operations and verify: POSTPONE
[per-forlin] Implement test case to evaluate BG TRIM maintenance: POSTPONE
[per-forlin] Add more performance test to mmc_test will cover trim and bg as well: POSTPONE
[per-forlin] Add debug code in mmc-framework to monitor/gather statistics from BKOPS_STATUS EXT_CSD: DONE
[per-forlin] Measure performance on aligned and unaligned btrfs, ext2, ext3, ext4: DONE
[per-forlin] Measure performance for btrfs with block size expected by card, vs too small too large: DONE
[per-forlin] Document results and conclusion on a wiki page.: POSTPONE

Work items (2. double buffer for DMA):
[per-forlin] Study BIDI in drivers/scsi, could it be used to some extent in MMC: DONE
[per-forlin] Implement a proof of concept double buffer implementation in MMC-framework: DONE
[per-forlin] Implement a proof of concept double buffer support in the host driver: DONE
[per-forlin] Run test to verify performance increase: DONE
[per-forlin] Run test to verify no performance loss if host driver ignores the next preparation: DONE
[per-forlin] Make a proper design: DONE
[per-forlin] break up implementation in parts, if possible send parts to mainline in increments: DONE
[per-forlin] Add support for pre-fetching a 2nd request in mmc/card/queue mmc_queue_thread(): DONE
[per-forlin] Decide how to handle mmc_blk_request in order to prepare ahead, currently this data is on the stack: DONE
[per-forlin] Split up the functionality in core/block.c rw_rq() to support preparing two request, only one will be transfered though: DONE
[per-forlin] Add support for preparation of the next request in host driver: DONE
[per-forlin] Test double buffering on another Linaro board: DONE
[per-forlin] Sketch mmc patch for SDHCI supporting pre_req() and post_req(): POSTPONE
[per-forlin] Rebase on mmc-next and identify any conflicts: DONE
[per-forlin] Send out double buffering patch as RFC: DONE
[per-forlin] Design test cases to verify stability and verify error handling: DONE
[per-forlin] Run test cases to verify stability and verify error handling, fix bugs as needed: DONE
[per-forlin] Get double buffering test results or feedback from other vendors/boards: POSTPONE
[per-forlin] Add additional tests to mmc_test.c if approriate: DONE
[per-forlin] Send three patchsets on MMC-framework, mmc host driver and mmc_test.c: DONE
[per-forlin] Send out patch-set v2: DONE
[per-forlin] Update after review: POSTPONE

Work items (3. Prevent small MMC transfers):
[per-forlin] Read up on the IO-scheduler: POSTPONE
[arnd-arndb] Implement test cases to show how performance depends on block size: DONE
[per-forlin] Measure performance for different IO-sched configurations: POSTPONE
[per-forlin] Implement probes to monitor statistics in block level queue: POSTPONE
[per-forlin] measure number of request in the queue: POSTPONE
[per-forlin] measure number of consecutive read/write request in the queue: POSTPONE
[per-forlin] measure number of reads and writes within a specified size ranges: POSTPONE
[per-forlin] Run tests to show what is causing none optimal block level request queue status: POSTPONE
[per-forlin] Decide if it's possible to improve the IO-scheduler or/and mmc block queue: POSTPONE
[per-forlin] break down improvements into work items and add below: POSTPONE

Work items (4. Priority):
[per-forlin] Read up on FS read/write priority, what could be used to set priority: POSTPONE
[per-forlin] List use cases when priority would be beneficial: POSTPONE
[per-forlin] Implement a priority member in the block request struct: POSTPONE
[per-forlin] Implement a proof of concept in the MMC framework to handle the priority flag: POSTPONE
[per-forlin] Implement test cases in mmc_test.c that utilize the priority flag: POSTPONE
[per-forlin] Make a proper design: POSTPONE
[per-forlin] Get the design reviewed: POSTPONE
[per-forlin] Update design after review: POSTPONE
[per-forlin] break up implementation in parts, if possible send parts to mainline in increments: POSTPONE
[per-forlin] break down design into work items to complete implementation: POSTPONE

Work items (5. Reliable eMMC)
[per-forlin] Reliable write has special requirements on alignment, investigate if this is a problem.: POSTPONE
[per-forlin] Add configuration in the MMC-framework to enable reliable write for all writes: POSTPONE
[per-forlin] Compare the throughput cost of normal write vs reliable write.: POSTPONE
[per-forlin] Implement and set up power crash tests: POSTPONE
[per-forlin] Compare the robustness cost of normal write vs reliable write.: POSTPONE
[per-forlin] At block level meta data is indicated by the cmd_flags & META_WRITE. Confirm this : POSTPONE
[per-forlin] Make a proper design: POSTPONE
[per-forlin] Get the design reviewed: POSTPONE
[per-forlin] Update design after review: POSTPONE
[per-forlin] break up implementation in parts, if possible send parts to mainline in increments: POSTPONE
[per-forlin] break down design into work items to complete implementation: POSTPONE

Work items (6. DDR_MODE eMMC):
[per-forlin] Implement or find a host driver with DDR_MODE support: DONE
[per-forlin] Run test to compare performance with DDR_MODE enable and disable: POSTPONE

Work items (7. FS for eMMC):
[per-forlin] Read up on FS/MMC-host-driver configuration that concerns MMC performance.: DONE
[per-forlin] Test different configurations for FS on eMMC: DONE

Work items (Migration):
[per-forlin] Update any valid docs under Documentation: POSTPONE
[per-forlin] Verify that all new features are covered by mmc_test.c: POSTPONE

(?)

Work Items

Dependency tree

* Blueprints in grey have been implemented.

This blueprint contains Public information 
Everyone can see this information.