diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-10-24 12:52:42 +0200 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-12-29 08:29:51 +0100 |
commit | a6f23657d3072bde6844055bbc2290e497f33fbc (patch) | |
tree | bd96916615d04228cc9492ae198ed5012d5ee86a /include/linux/genhd.h | |
parent | 30e0dc28bff9dc456cdfc2aae4aca78b8b1a1cec (diff) | |
download | op-kernel-dev-a6f23657d3072bde6844055bbc2290e497f33fbc.zip op-kernel-dev-a6f23657d3072bde6844055bbc2290e497f33fbc.tar.gz |
block: add one-hit cache for disk partition lookup
disk_map_sector_rcu() returns a partition from a sector offset,
which we use for IO statistics on a per-partition basis. The
lookup itself is an O(N) list lookup, where N is the number of
partitions. This actually hurts performance quite a bit, even
on the lower end partitions. On higher numbered partitions,
it can get pretty bad.
Solve this by adding a one-hit cache for partition lookup.
This makes the lookup O(1) for the case where we do most IO to
one partition. Even for mixed partition workloads, amortized cost
is pretty close to O(1) since the natural IO batching makes the
one-hit cache last for lots of IOs.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include/linux/genhd.h')
-rw-r--r-- | include/linux/genhd.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 3df7742..16948ea 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -126,6 +126,7 @@ struct blk_scsi_cmd_filter { struct disk_part_tbl { struct rcu_head rcu_head; int len; + struct hd_struct *last_lookup; struct hd_struct *part[]; }; |