FILESYSTEM: dynamic read-ahead
/block/genhd.c
blob:de7fc3ebb821680515b43497e5c5a7c866b9df1a -> blob:8cb20a38a7fd547dc9c4b5bf69877b880db41b3c
--- 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);