ANDROID: dm verity: add minimum prefetch size

- For device like eMMC, it gives better performance to read more hash
  blocks at a time.
- For android, set it to default 128.
  For other devices, set it to 1 which is the same as now.
- saved boot-up time by 300ms in tested device

bug: 32246564

Cc: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Keun-young Park <keunyoung@google.com>
This commit is contained in:
Keun-young Park 2016-11-14 18:25:15 -08:00 committed by Amit Pundir
parent 35194db1b7
commit 26a380b3ce
2 changed files with 24 additions and 1 deletions

View file

@ -458,6 +458,21 @@ config DM_VERITY
If unsure, say N.
config DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
bool "Prefetch size 128"
config DM_VERITY_HASH_PREFETCH_MIN_SIZE
int "Verity hash prefetch minimum size"
depends on DM_VERITY
range 1 4096
default 128 if DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
default 1
---help---
This sets minimum number of hash blocks to prefetch for dm-verity.
For devices like eMMC, having larger prefetch size like 128 can improve
performance with increased memory consumption for keeping more hashes
in RAM.
config DM_VERITY_FEC
bool "Verity forward error correction support"
depends on DM_VERITY
@ -510,6 +525,7 @@ config DM_ANDROID_VERITY
depends on ASYMMETRIC_KEY_TYPE
depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE
depends on MD_LINEAR
select DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
---help---
This device-mapper target is virtually a VERITY target. This
target is setup by reading the metadata contents piggybacked

View file

@ -501,6 +501,7 @@ static void verity_prefetch_io(struct work_struct *work)
container_of(work, struct dm_verity_prefetch_work, work);
struct dm_verity *v = pw->v;
int i;
sector_t prefetch_size;
for (i = v->levels - 2; i >= 0; i--) {
sector_t hash_block_start;
@ -523,8 +524,14 @@ static void verity_prefetch_io(struct work_struct *work)
hash_block_end = v->hash_blocks - 1;
}
no_prefetch_cluster:
// for emmc, it is more efficient to send bigger read
prefetch_size = max((sector_t)CONFIG_DM_VERITY_HASH_PREFETCH_MIN_SIZE,
hash_block_end - hash_block_start + 1);
if ((hash_block_start + prefetch_size) >= (v->hash_start + v->hash_blocks)) {
prefetch_size = hash_block_end - hash_block_start + 1;
}
dm_bufio_prefetch(v->bufio, hash_block_start,
hash_block_end - hash_block_start + 1);
prefetch_size);
}
kfree(pw);