FILESYSTEM: dynamic read-ahead
/block/genhd.c
blob:61b99c3f5c4b545eb5ae9cfe1f88a2d137b3c209 -> blob:766b43e12a97c1b6bcf5170da8f02216694adbd5
--- block/genhd.c
+++ block/genhd.c
@@ -624,6 +624,26 @@ void add_disk(struct gendisk *disk)
"bdi");
WARN_ON(retval);
+ /*
+ * Limit default readahead size for small devices.
+ * disk size readahead size
+ * 1M 8k
+ * 4M 16k
+ * 16M 32k
+ * 64M 64k
+ * 256M 128k
+ * 1G 256k
+ * 4G 512k
+ * 16G 1024k
+ * 64G 2048k
+ * 256G 4096k
+ */
+ if (get_capacity(disk)) {
+ unsigned long size = get_capacity(disk) >> 9;
+ size = 1UL << (ilog2(size) / 2);
+ bdi->ra_pages = min(bdi->ra_pages, size);
+ }
+
disk_add_events(disk);
}
EXPORT_SYMBOL(add_disk);