Investigate performance of eMMC storage, fix as needed

Registered by Loïc Minier

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
Completed by
Deepak Saxena

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.