@@ -1022,6 +1022,13 @@ static void clear_incompat_bg_bits(struct btrfs_fs_info *fs_info, u64 flags)
1022
1022
}
1023
1023
}
1024
1024
1025
+ static struct btrfs_root * btrfs_block_group_root (struct btrfs_fs_info * fs_info )
1026
+ {
1027
+ if (btrfs_fs_compat_ro (fs_info , BLOCK_GROUP_TREE ))
1028
+ return fs_info -> block_group_root ;
1029
+ return btrfs_extent_root (fs_info , 0 );
1030
+ }
1031
+
1025
1032
static int remove_block_group_item (struct btrfs_trans_handle * trans ,
1026
1033
struct btrfs_path * path ,
1027
1034
struct btrfs_block_group * block_group )
@@ -1757,24 +1764,21 @@ static inline bool btrfs_should_reclaim(struct btrfs_fs_info *fs_info)
1757
1764
1758
1765
static bool should_reclaim_block_group (struct btrfs_block_group * bg , u64 bytes_freed )
1759
1766
{
1760
- const struct btrfs_space_info * space_info = bg -> space_info ;
1761
- const int reclaim_thresh = READ_ONCE ( space_info -> bg_reclaim_threshold );
1767
+ const int thresh_pct = btrfs_calc_reclaim_threshold ( bg -> space_info ) ;
1768
+ u64 thresh_bytes = mult_perc ( bg -> length , thresh_pct );
1762
1769
const u64 new_val = bg -> used ;
1763
1770
const u64 old_val = new_val + bytes_freed ;
1764
- u64 thresh ;
1765
1771
1766
- if (reclaim_thresh == 0 )
1772
+ if (thresh_bytes == 0 )
1767
1773
return false;
1768
1774
1769
- thresh = mult_perc (bg -> length , reclaim_thresh );
1770
-
1771
1775
/*
1772
1776
* If we were below the threshold before don't reclaim, we are likely a
1773
1777
* brand new block group and we don't want to relocate new block groups.
1774
1778
*/
1775
- if (old_val < thresh )
1779
+ if (old_val < thresh_bytes )
1776
1780
return false;
1777
- if (new_val >= thresh )
1781
+ if (new_val >= thresh_bytes )
1778
1782
return false;
1779
1783
return true;
1780
1784
}
@@ -1821,6 +1825,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1821
1825
list_sort (NULL , & fs_info -> reclaim_bgs , reclaim_bgs_cmp );
1822
1826
while (!list_empty (& fs_info -> reclaim_bgs )) {
1823
1827
u64 zone_unusable ;
1828
+ u64 reclaimed ;
1824
1829
int ret = 0 ;
1825
1830
1826
1831
bg = list_first_entry (& fs_info -> reclaim_bgs ,
@@ -1834,6 +1839,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1834
1839
/* Don't race with allocators so take the groups_sem */
1835
1840
down_write (& space_info -> groups_sem );
1836
1841
1842
+ spin_lock (& space_info -> lock );
1837
1843
spin_lock (& bg -> lock );
1838
1844
if (bg -> reserved || bg -> pinned || bg -> ro ) {
1839
1845
/*
@@ -1843,6 +1849,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1843
1849
* this block group.
1844
1850
*/
1845
1851
spin_unlock (& bg -> lock );
1852
+ spin_unlock (& space_info -> lock );
1846
1853
up_write (& space_info -> groups_sem );
1847
1854
goto next ;
1848
1855
}
@@ -1861,6 +1868,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1861
1868
if (!btrfs_test_opt (fs_info , DISCARD_ASYNC ))
1862
1869
btrfs_mark_bg_unused (bg );
1863
1870
spin_unlock (& bg -> lock );
1871
+ spin_unlock (& space_info -> lock );
1864
1872
up_write (& space_info -> groups_sem );
1865
1873
goto next ;
1866
1874
@@ -1877,10 +1885,12 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1877
1885
*/
1878
1886
if (!should_reclaim_block_group (bg , bg -> length )) {
1879
1887
spin_unlock (& bg -> lock );
1888
+ spin_unlock (& space_info -> lock );
1880
1889
up_write (& space_info -> groups_sem );
1881
1890
goto next ;
1882
1891
}
1883
1892
spin_unlock (& bg -> lock );
1893
+ spin_unlock (& space_info -> lock );
1884
1894
1885
1895
/*
1886
1896
* Get out fast, in case we're read-only or unmounting the
@@ -1913,15 +1923,26 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1913
1923
div64_u64 (bg -> used * 100 , bg -> length ),
1914
1924
div64_u64 (zone_unusable * 100 , bg -> length ));
1915
1925
trace_btrfs_reclaim_block_group (bg );
1926
+ reclaimed = bg -> used ;
1916
1927
ret = btrfs_relocate_chunk (fs_info , bg -> start );
1917
1928
if (ret ) {
1918
1929
btrfs_dec_block_group_ro (bg );
1919
1930
btrfs_err (fs_info , "error relocating chunk %llu" ,
1920
1931
bg -> start );
1932
+ spin_lock (& space_info -> lock );
1933
+ space_info -> reclaim_count ++ ;
1934
+ if (READ_ONCE (space_info -> periodic_reclaim ))
1935
+ space_info -> periodic_reclaim_ready = false;
1936
+ spin_unlock (& space_info -> lock );
1937
+ } else {
1938
+ spin_lock (& space_info -> lock );
1939
+ space_info -> reclaim_count ++ ;
1940
+ space_info -> reclaim_bytes += reclaimed ;
1941
+ spin_unlock (& space_info -> lock );
1921
1942
}
1922
1943
1923
1944
next :
1924
- if (ret )
1945
+ if (ret && ! READ_ONCE ( space_info -> periodic_reclaim ) )
1925
1946
btrfs_mark_bg_to_reclaim (bg );
1926
1947
btrfs_put_block_group (bg );
1927
1948
@@ -1948,6 +1969,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
1948
1969
1949
1970
void btrfs_reclaim_bgs (struct btrfs_fs_info * fs_info )
1950
1971
{
1972
+ btrfs_reclaim_sweep (fs_info );
1951
1973
spin_lock (& fs_info -> unused_bgs_lock );
1952
1974
if (!list_empty (& fs_info -> reclaim_bgs ))
1953
1975
queue_work (system_unbound_wq , & fs_info -> reclaim_bgs_work );
@@ -3646,9 +3668,12 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans,
3646
3668
old_val += num_bytes ;
3647
3669
cache -> used = old_val ;
3648
3670
cache -> reserved -= num_bytes ;
3671
+ cache -> reclaim_mark = 0 ;
3649
3672
space_info -> bytes_reserved -= num_bytes ;
3650
3673
space_info -> bytes_used += num_bytes ;
3651
3674
space_info -> disk_used += num_bytes * factor ;
3675
+ if (READ_ONCE (space_info -> periodic_reclaim ))
3676
+ btrfs_space_info_update_reclaimable (space_info , - num_bytes );
3652
3677
spin_unlock (& cache -> lock );
3653
3678
spin_unlock (& space_info -> lock );
3654
3679
} else {
@@ -3658,8 +3683,10 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans,
3658
3683
btrfs_space_info_update_bytes_pinned (info , space_info , num_bytes );
3659
3684
space_info -> bytes_used -= num_bytes ;
3660
3685
space_info -> disk_used -= num_bytes * factor ;
3661
-
3662
- reclaim = should_reclaim_block_group (cache , num_bytes );
3686
+ if (READ_ONCE (space_info -> periodic_reclaim ))
3687
+ btrfs_space_info_update_reclaimable (space_info , num_bytes );
3688
+ else
3689
+ reclaim = should_reclaim_block_group (cache , num_bytes );
3663
3690
3664
3691
spin_unlock (& cache -> lock );
3665
3692
spin_unlock (& space_info -> lock );
0 commit comments