• Qu Wenruo's avatar
    btrfs: scrub: remove scrub_sector::page and use scrub_block::pages instead · eb2fad30
    Qu Wenruo authored
    Although scrub currently works for subpage (PAGE_SIZE > sectorsize) cases,
    it will allocate one page for each scrub_sector, which can cause extra
    unnecessary memory usage.
    
    Utilize scrub_block::pages[] instead of allocating page for each
    scrub_sector, this allows us to integrate larger extents while using
    less memory.
    
    For example, if our page size is 64K, sectorsize is 4K, and we got an
    32K sized extent.
    We will only allocate one page for scrub_block, and all 8 scrub sectors
    will point to that page.
    
    To do that properly, here we introduce several small helpers:
    
    - scrub_page_get_logical()
      Get the logical bytenr of a page.
      We store the logical bytenr of the page range into page::private.
      But for 32bit systems, their (void *) is not large enough to contain
      a u64, so in that case we will need to allocate extra memory for it.
    
      For 64bit systems, we can use page::private directly.
    
    - scrub_block_get_logical()
      Just get the logical bytenr of the first page.
    
    - scrub_sector_get_page()
      Return the page which the scrub_sector points to.
    
    - scrub_sector_get_page_offset()
      Return the offset inside the page which the scrub_sector points to.
    
    - scrub_sector_get_kaddr()
      Return the address which the scrub_sector points to.
      Just a wrapper using scrub_sector_get_page() and
      scrub_sector_get_page_offset()
    
    - bio_add_scrub_sector()
    
    Please note that, even with this patch, we're still allocating one page
    for one sector for data extents.
    
    This is because in scrub_extent() we split the data extent using
    sectorsize.
    
    The memory usage reduction will need extra work to make scrub to work
    like data read to only use the correct sector(s).
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    eb2fad30
scrub.c 123 KB