• Yufen Yu's avatar
    md/raid5: let multiple devices of stripe_head share page · 046169f0
    Yufen Yu authored
    In current implementation, grow_buffers() uses alloc_page() to
    allocate the buffers for each stripe_head, i.e. allocate a page
    for each dev[i] in stripe_head.
    
    After setting stripe_size as a configurable value by writing
    sysfs entry, it means that we always allocate 64K buffers, but
    just use 4K of them when stripe_size is 4K in 64KB arm64.
    
    To avoid wasting memory, we try to let multiple sh->dev share
    one real page. That means, multiple sh->dev[i].page will point
    to the only page with different offset. Example of 64K PAGE_SIZE
    and 4K stripe_size as following:
    
                        64K PAGE_SIZE
              +---+---+---+---+------------------------------+
              |   |   |   |   |
              |   |   |   |   |
              +-+-+-+-+-+-+-+-+------------------------------+
                ^   ^   ^   ^
                |   |   |   +----------------------------+
                |   |   |                                |
                |   |   +-------------------+            |
                |   |                       |            |
                |   +----------+            |            |
                |              |            |            |
                +-+            |            |            |
                  |            |            |            |
            +-----+-----+------+-----+------+-----+------+------+
    sh      | offset(0) | offset(4K) | offset(8K) | offset(12K) |
     +      +-----------+------------+------------+-------------+
     +----> dev[0].page  dev[1].page  dev[2].page  dev[3].page
    
    A new 'pages' array will be added into stripe_head to record shared
    page used by this stripe_head. Allocate them when grow_buffers()
    and free them when shrink_buffers().
    
    After trying to share page, the users of sh->dev[i].page need to take
    care of the related page offset: page of issued bio and page passed
    to xor compution functions. But thanks for previous different page offset
    supported. Here, we just need to set correct dev[i].offset.
    Signed-off-by: default avatarYufen Yu <yuyufen@huawei.com>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    046169f0
raid5.c 246 KB