diff options
| -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, |
