diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/free-space-cache.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 4eb296426061..5c2caad76212 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -259,7 +259,9 @@ static int link_free_space(struct btrfs_block_group_cache *block_group, | |||
259 | 259 | ||
260 | static void recalculate_thresholds(struct btrfs_block_group_cache *block_group) | 260 | static void recalculate_thresholds(struct btrfs_block_group_cache *block_group) |
261 | { | 261 | { |
262 | u64 max_bytes, possible_bytes; | 262 | u64 max_bytes; |
263 | u64 bitmap_bytes; | ||
264 | u64 extent_bytes; | ||
263 | 265 | ||
264 | /* | 266 | /* |
265 | * The goal is to keep the total amount of memory used per 1gb of space | 267 | * The goal is to keep the total amount of memory used per 1gb of space |
@@ -269,22 +271,27 @@ static void recalculate_thresholds(struct btrfs_block_group_cache *block_group) | |||
269 | max_bytes = MAX_CACHE_BYTES_PER_GIG * | 271 | max_bytes = MAX_CACHE_BYTES_PER_GIG * |
270 | (div64_u64(block_group->key.offset, 1024 * 1024 * 1024)); | 272 | (div64_u64(block_group->key.offset, 1024 * 1024 * 1024)); |
271 | 273 | ||
272 | possible_bytes = (block_group->total_bitmaps * PAGE_CACHE_SIZE) + | 274 | /* |
273 | (sizeof(struct btrfs_free_space) * | 275 | * we want to account for 1 more bitmap than what we have so we can make |
274 | block_group->extents_thresh); | 276 | * sure we don't go over our overall goal of MAX_CACHE_BYTES_PER_GIG as |
277 | * we add more bitmaps. | ||
278 | */ | ||
279 | bitmap_bytes = (block_group->total_bitmaps + 1) * PAGE_CACHE_SIZE; | ||
275 | 280 | ||
276 | if (possible_bytes > max_bytes) { | 281 | if (bitmap_bytes >= max_bytes) { |
277 | int extent_bytes = max_bytes - | 282 | block_group->extents_thresh = 0; |
278 | (block_group->total_bitmaps * PAGE_CACHE_SIZE); | 283 | return; |
284 | } | ||
279 | 285 | ||
280 | if (extent_bytes <= 0) { | 286 | /* |
281 | block_group->extents_thresh = 0; | 287 | * we want the extent entry threshold to always be at most 1/2 the maxw |
282 | return; | 288 | * bytes we can have, or whatever is less than that. |
283 | } | 289 | */ |
290 | extent_bytes = max_bytes - bitmap_bytes; | ||
291 | extent_bytes = min_t(u64, extent_bytes, div64_u64(max_bytes, 2)); | ||
284 | 292 | ||
285 | block_group->extents_thresh = extent_bytes / | 293 | block_group->extents_thresh = |
286 | (sizeof(struct btrfs_free_space)); | 294 | div64_u64(extent_bytes, (sizeof(struct btrfs_free_space))); |
287 | } | ||
288 | } | 295 | } |
289 | 296 | ||
290 | static void bitmap_clear_bits(struct btrfs_block_group_cache *block_group, | 297 | static void bitmap_clear_bits(struct btrfs_block_group_cache *block_group, |