mbox series

[md-6.12,00/41] md/md-bitmap: introduce bitmap_operations and make structure internel

Message ID 20240822024718.2158259-1-yukuai1@huaweicloud.com (mailing list archive)
Headers show
Series md/md-bitmap: introduce bitmap_operations and make structure internel | expand

Message

Yu Kuai Aug. 22, 2024, 2:46 a.m. UTC
From: Yu Kuai <yukuai3@huawei.com>

Changes from RFC v1:
 - add patch 1-8 to prevent dereference bitmap directly, and the last
 patch to make bitmap structure internel.
 - use plain function alls "bitmap_ops->xxx()" directly;

Changes from RFC v2:
 - some coding style.

The background is that currently bitmap is using a global spin_lock,
cauing lock contention and huge IO performance degration for all raid
levels.

However, it's impossible to implement a new lock free bitmap with
current situation that md-bitmap exposes the internal implementation
with lots of exported apis. Hence bitmap_operations is invented, to
describe bitmap core implementation, and a new bitmap can be introduced
with a new bitmap_operations, we only need to switch to the new one
during initialization.

And with this we can build bitmap as kernel module, but that's not
our concern for now.

This version was tested with mdadm tests. There are still few failed
tests in my VM, howerver, it's the test itself need to be fixed and
we're working on it.

Yu Kuai (41):
  md/raid1: use md_bitmap_wait_behind_writes() in raid1_read_request()
  md/md-bitmap: replace md_bitmap_status() with a new helper
    md_bitmap_get_stats()
  md: use new helper md_bitmap_get_stats() in update_array_info()
  md/md-bitmap: add 'events_cleared' into struct md_bitmap_stats
  md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
  md/md-bitmap: add 'file_pages' into struct md_bitmap_stats
  md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct
    md_bitmap_stats
  md/md-cluster: use helper md_bitmap_get_stats() to get pages in
    resize_bitmaps()
  md/md-bitmap: add a new helper md_bitmap_set_pages()
  md/md-bitmap: introduce struct bitmap_operations
  md/md-bitmap: simplify md_bitmap_create() + md_bitmap_load()
  md/md-bitmap: merge md_bitmap_create() into bitmap_operations
  md/md-bitmap: merge md_bitmap_load() into bitmap_operations
  md/md-bitmap: merge md_bitmap_destroy() into bitmap_operations
  md/md-bitmap: merge md_bitmap_flush() into bitmap_operations
  md/md-bitmap: make md_bitmap_print_sb() internal
  md/md-bitmap: merge md_bitmap_update_sb() into bitmap_operations
  md/md-bitmap: merge md_bitmap_status() into bitmap_operations
  md/md-bitmap: remove md_bitmap_setallbits()
  md/md-bitmap: merge bitmap_write_all() into bitmap_operations
  md/md-bitmap: merge md_bitmap_dirty_bits() into bitmap_operations
  md/md-bitmap: merge md_bitmap_startwrite() into bitmap_operations
  md/md-bitmap: merge md_bitmap_endwrite() into bitmap_operations
  md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations
  md/md-bitmap: remove the parameter 'aborted' for md_bitmap_end_sync()
  md/md-bitmap: merge md_bitmap_end_sync() into bitmap_operations
  md/md-bitmap: merge md_bitmap_close_sync() into bitmap_operations
  md/md-bitmap: mrege md_bitmap_cond_end_sync() into bitmap_operations
  md/md-bitmap: merge md_bitmap_sync_with_cluster() into
    bitmap_operations
  md/md-bitmap: merge md_bitmap_unplug_async() into md_bitmap_unplug()
  md/md-bitmap: merge bitmap_unplug() into bitmap_operations
  md/md-bitmap: merge md_bitmap_daemon_work() into bitmap_operations
  md/md-bitmap: pass in mddev directly for md_bitmap_resize()
  md/md-bitmap: merge md_bitmap_resize() into bitmap_operations
  md/md-bitmap: merge get_bitmap_from_slot() into bitmap_operations
  md/md-bitmap: merge md_bitmap_copy_from_slot() into struct
    bitmap_operation.
  md/md-bitmap: merge md_bitmap_set_pages() into struct
    bitmap_operations
  md/md-bitmap: merge md_bitmap_free() into bitmap_operations
  md/md-bitmap: merge md_bitmap_wait_behind_writes() into
    bitmap_operations
  md/md-bitmap: merge md_bitmap_enabled() into bitmap_operations
  md/md-bitmap: make in memory structure internal

 drivers/md/dm-raid.c     |   7 +-
 drivers/md/md-bitmap.c   | 560 +++++++++++++++++++++++++++++----------
 drivers/md/md-bitmap.h   | 268 ++++---------------
 drivers/md/md-cluster.c  |  91 ++++---
 drivers/md/md.c          | 155 +++++++----
 drivers/md/md.h          |   3 +-
 drivers/md/raid1-10.c    |   9 +-
 drivers/md/raid1.c       |  78 +++---
 drivers/md/raid10.c      |  73 ++---
 drivers/md/raid5-cache.c |   8 +-
 drivers/md/raid5.c       |  62 ++---
 11 files changed, 752 insertions(+), 562 deletions(-)

Comments

Paul Menzel Aug. 22, 2024, 6:50 a.m. UTC | #1
Dear Yu,


Thank you for this patch series.


Am 22.08.24 um 04:46 schrieb Yu Kuai:
> From: Yu Kuai <yukuai3@huawei.com>
> 
> Changes from RFC v1:
>   - add patch 1-8 to prevent dereference bitmap directly, and the last
>   patch to make bitmap structure internel.
>   - use plain function alls "bitmap_ops->xxx()" directly;
> 
> Changes from RFC v2:
>   - some coding style.
> 
> The background is that currently bitmap is using a global spin_lock,
> cauing lock contention and huge IO performance degration for all raid

cau*s*ing
degra*da*tion

> levels.
> 
> However, it's impossible to implement a new lock free bitmap with
> current situation that md-bitmap exposes the internal implementation
> with lots of exported apis. Hence bitmap_operations is invented, to
> describe bitmap core implementation, and a new bitmap can be introduced
> with a new bitmap_operations, we only need to switch to the new one
> during initialization.
> 
> And with this we can build bitmap as kernel module, but that's not
> our concern for now.
> 
> This version was tested with mdadm tests. There are still few failed
> tests in my VM, howerver, it's the test itself need to be fixed and

however

> we're working on it.

It’d be great if you shared the benchmark data, and how this can be 
verified on other setups, so performance does not degrade on some sometimes.


Kind regards,

Paul


> Yu Kuai (41):
>    md/raid1: use md_bitmap_wait_behind_writes() in raid1_read_request()
>    md/md-bitmap: replace md_bitmap_status() with a new helper
>      md_bitmap_get_stats()
>    md: use new helper md_bitmap_get_stats() in update_array_info()
>    md/md-bitmap: add 'events_cleared' into struct md_bitmap_stats
>    md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
>    md/md-bitmap: add 'file_pages' into struct md_bitmap_stats
>    md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct
>      md_bitmap_stats
>    md/md-cluster: use helper md_bitmap_get_stats() to get pages in
>      resize_bitmaps()
>    md/md-bitmap: add a new helper md_bitmap_set_pages()
>    md/md-bitmap: introduce struct bitmap_operations
>    md/md-bitmap: simplify md_bitmap_create() + md_bitmap_load()
>    md/md-bitmap: merge md_bitmap_create() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_load() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_destroy() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_flush() into bitmap_operations
>    md/md-bitmap: make md_bitmap_print_sb() internal
>    md/md-bitmap: merge md_bitmap_update_sb() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_status() into bitmap_operations
>    md/md-bitmap: remove md_bitmap_setallbits()
>    md/md-bitmap: merge bitmap_write_all() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_dirty_bits() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_startwrite() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_endwrite() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations
>    md/md-bitmap: remove the parameter 'aborted' for md_bitmap_end_sync()
>    md/md-bitmap: merge md_bitmap_end_sync() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_close_sync() into bitmap_operations
>    md/md-bitmap: mrege md_bitmap_cond_end_sync() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_sync_with_cluster() into
>      bitmap_operations
>    md/md-bitmap: merge md_bitmap_unplug_async() into md_bitmap_unplug()
>    md/md-bitmap: merge bitmap_unplug() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_daemon_work() into bitmap_operations
>    md/md-bitmap: pass in mddev directly for md_bitmap_resize()
>    md/md-bitmap: merge md_bitmap_resize() into bitmap_operations
>    md/md-bitmap: merge get_bitmap_from_slot() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_copy_from_slot() into struct
>      bitmap_operation.
>    md/md-bitmap: merge md_bitmap_set_pages() into struct
>      bitmap_operations
>    md/md-bitmap: merge md_bitmap_free() into bitmap_operations
>    md/md-bitmap: merge md_bitmap_wait_behind_writes() into
>      bitmap_operations
>    md/md-bitmap: merge md_bitmap_enabled() into bitmap_operations
>    md/md-bitmap: make in memory structure internal
> 
>   drivers/md/dm-raid.c     |   7 +-
>   drivers/md/md-bitmap.c   | 560 +++++++++++++++++++++++++++++----------
>   drivers/md/md-bitmap.h   | 268 ++++---------------
>   drivers/md/md-cluster.c  |  91 ++++---
>   drivers/md/md.c          | 155 +++++++----
>   drivers/md/md.h          |   3 +-
>   drivers/md/raid1-10.c    |   9 +-
>   drivers/md/raid1.c       |  78 +++---
>   drivers/md/raid10.c      |  73 ++---
>   drivers/md/raid5-cache.c |   8 +-
>   drivers/md/raid5.c       |  62 ++---
>   11 files changed, 752 insertions(+), 562 deletions(-)
>
Xiao Ni Aug. 22, 2024, 8:38 a.m. UTC | #2
On Thu, Aug 22, 2024 at 10:52 AM Yu Kuai <yukuai1@huaweicloud.com> wrote:
>
> From: Yu Kuai <yukuai3@huawei.com>
>
> Changes from RFC v1:
>  - add patch 1-8 to prevent dereference bitmap directly, and the last
>  patch to make bitmap structure internel.
>  - use plain function alls "bitmap_ops->xxx()" directly;
>
> Changes from RFC v2:
>  - some coding style.
>
> The background is that currently bitmap is using a global spin_lock,
> cauing lock contention and huge IO performance degration for all raid
> levels.
>
> However, it's impossible to implement a new lock free bitmap with
> current situation that md-bitmap exposes the internal implementation
> with lots of exported apis. Hence bitmap_operations is invented, to
> describe bitmap core implementation, and a new bitmap can be introduced
> with a new bitmap_operations, we only need to switch to the new one
> during initialization.
>
> And with this we can build bitmap as kernel module, but that's not
> our concern for now.
>
> This version was tested with mdadm tests. There are still few failed
> tests in my VM, howerver, it's the test itself need to be fixed and
> we're working on it.

Hi Kuai

Do you run lvm2 test regression tests? It's better to run lvm2
regression tests for such a big change.

And by the way, does this patch set have a conflict with patch set
"[RFC V7] md/bitmap: Optimize lock contention". I haven't read the
patches, it's an optimization for the bitmap lock too.

Best Regards
Xiao
>
> Yu Kuai (41):
>   md/raid1: use md_bitmap_wait_behind_writes() in raid1_read_request()
>   md/md-bitmap: replace md_bitmap_status() with a new helper
>     md_bitmap_get_stats()
>   md: use new helper md_bitmap_get_stats() in update_array_info()
>   md/md-bitmap: add 'events_cleared' into struct md_bitmap_stats
>   md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
>   md/md-bitmap: add 'file_pages' into struct md_bitmap_stats
>   md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct
>     md_bitmap_stats
>   md/md-cluster: use helper md_bitmap_get_stats() to get pages in
>     resize_bitmaps()
>   md/md-bitmap: add a new helper md_bitmap_set_pages()
>   md/md-bitmap: introduce struct bitmap_operations
>   md/md-bitmap: simplify md_bitmap_create() + md_bitmap_load()
>   md/md-bitmap: merge md_bitmap_create() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_load() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_destroy() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_flush() into bitmap_operations
>   md/md-bitmap: make md_bitmap_print_sb() internal
>   md/md-bitmap: merge md_bitmap_update_sb() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_status() into bitmap_operations
>   md/md-bitmap: remove md_bitmap_setallbits()
>   md/md-bitmap: merge bitmap_write_all() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_dirty_bits() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_startwrite() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_endwrite() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations
>   md/md-bitmap: remove the parameter 'aborted' for md_bitmap_end_sync()
>   md/md-bitmap: merge md_bitmap_end_sync() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_close_sync() into bitmap_operations
>   md/md-bitmap: mrege md_bitmap_cond_end_sync() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_sync_with_cluster() into
>     bitmap_operations
>   md/md-bitmap: merge md_bitmap_unplug_async() into md_bitmap_unplug()
>   md/md-bitmap: merge bitmap_unplug() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_daemon_work() into bitmap_operations
>   md/md-bitmap: pass in mddev directly for md_bitmap_resize()
>   md/md-bitmap: merge md_bitmap_resize() into bitmap_operations
>   md/md-bitmap: merge get_bitmap_from_slot() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_copy_from_slot() into struct
>     bitmap_operation.
>   md/md-bitmap: merge md_bitmap_set_pages() into struct
>     bitmap_operations
>   md/md-bitmap: merge md_bitmap_free() into bitmap_operations
>   md/md-bitmap: merge md_bitmap_wait_behind_writes() into
>     bitmap_operations
>   md/md-bitmap: merge md_bitmap_enabled() into bitmap_operations
>   md/md-bitmap: make in memory structure internal
>
>  drivers/md/dm-raid.c     |   7 +-
>  drivers/md/md-bitmap.c   | 560 +++++++++++++++++++++++++++++----------
>  drivers/md/md-bitmap.h   | 268 ++++---------------
>  drivers/md/md-cluster.c  |  91 ++++---
>  drivers/md/md.c          | 155 +++++++----
>  drivers/md/md.h          |   3 +-
>  drivers/md/raid1-10.c    |   9 +-
>  drivers/md/raid1.c       |  78 +++---
>  drivers/md/raid10.c      |  73 ++---
>  drivers/md/raid5-cache.c |   8 +-
>  drivers/md/raid5.c       |  62 ++---
>  11 files changed, 752 insertions(+), 562 deletions(-)
>
> --
> 2.39.2
>
Yu Kuai Aug. 26, 2024, 1:40 a.m. UTC | #3
Hi,

在 2024/08/22 14:50, Paul Menzel 写道:
> Dear Yu,
> 
> 
> Thank you for this patch series.
> 
> 
> Am 22.08.24 um 04:46 schrieb Yu Kuai:
>> From: Yu Kuai <yukuai3@huawei.com>
>>
>> Changes from RFC v1:
>>   - add patch 1-8 to prevent dereference bitmap directly, and the last
>>   patch to make bitmap structure internel.
>>   - use plain function alls "bitmap_ops->xxx()" directly;
>>
>> Changes from RFC v2:
>>   - some coding style.
>>
>> The background is that currently bitmap is using a global spin_lock,
>> cauing lock contention and huge IO performance degration for all raid
> 
> cau*s*ing
> degra*da*tion
> 
>> levels.
>>
>> However, it's impossible to implement a new lock free bitmap with
>> current situation that md-bitmap exposes the internal implementation
>> with lots of exported apis. Hence bitmap_operations is invented, to
>> describe bitmap core implementation, and a new bitmap can be introduced
>> with a new bitmap_operations, we only need to switch to the new one
>> during initialization.
>>
>> And with this we can build bitmap as kernel module, but that's not
>> our concern for now.
>>
>> This version was tested with mdadm tests. There are still few failed
>> tests in my VM, howerver, it's the test itself need to be fixed and
> 
> however
> 
>> we're working on it.
> 
> It’d be great if you shared the benchmark data, and how this can be 
> verified on other setups, so performance does not degrade on some 
> sometimes.

Performance is not tested yet. Because this set doesn't have much
functional changes, jus some code cleanup.

Thanks,
Kuai

> 
> 
> Kind regards,
> 
> Paul
> 
> 
>> Yu Kuai (41):
>>    md/raid1: use md_bitmap_wait_behind_writes() in raid1_read_request()
>>    md/md-bitmap: replace md_bitmap_status() with a new helper
>>      md_bitmap_get_stats()
>>    md: use new helper md_bitmap_get_stats() in update_array_info()
>>    md/md-bitmap: add 'events_cleared' into struct md_bitmap_stats
>>    md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
>>    md/md-bitmap: add 'file_pages' into struct md_bitmap_stats
>>    md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct
>>      md_bitmap_stats
>>    md/md-cluster: use helper md_bitmap_get_stats() to get pages in
>>      resize_bitmaps()
>>    md/md-bitmap: add a new helper md_bitmap_set_pages()
>>    md/md-bitmap: introduce struct bitmap_operations
>>    md/md-bitmap: simplify md_bitmap_create() + md_bitmap_load()
>>    md/md-bitmap: merge md_bitmap_create() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_load() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_destroy() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_flush() into bitmap_operations
>>    md/md-bitmap: make md_bitmap_print_sb() internal
>>    md/md-bitmap: merge md_bitmap_update_sb() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_status() into bitmap_operations
>>    md/md-bitmap: remove md_bitmap_setallbits()
>>    md/md-bitmap: merge bitmap_write_all() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_dirty_bits() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_startwrite() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_endwrite() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations
>>    md/md-bitmap: remove the parameter 'aborted' for md_bitmap_end_sync()
>>    md/md-bitmap: merge md_bitmap_end_sync() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_close_sync() into bitmap_operations
>>    md/md-bitmap: mrege md_bitmap_cond_end_sync() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_sync_with_cluster() into
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_unplug_async() into md_bitmap_unplug()
>>    md/md-bitmap: merge bitmap_unplug() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_daemon_work() into bitmap_operations
>>    md/md-bitmap: pass in mddev directly for md_bitmap_resize()
>>    md/md-bitmap: merge md_bitmap_resize() into bitmap_operations
>>    md/md-bitmap: merge get_bitmap_from_slot() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_copy_from_slot() into struct
>>      bitmap_operation.
>>    md/md-bitmap: merge md_bitmap_set_pages() into struct
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_free() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_wait_behind_writes() into
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_enabled() into bitmap_operations
>>    md/md-bitmap: make in memory structure internal
>>
>>   drivers/md/dm-raid.c     |   7 +-
>>   drivers/md/md-bitmap.c   | 560 +++++++++++++++++++++++++++++----------
>>   drivers/md/md-bitmap.h   | 268 ++++---------------
>>   drivers/md/md-cluster.c  |  91 ++++---
>>   drivers/md/md.c          | 155 +++++++----
>>   drivers/md/md.h          |   3 +-
>>   drivers/md/raid1-10.c    |   9 +-
>>   drivers/md/raid1.c       |  78 +++---
>>   drivers/md/raid10.c      |  73 ++---
>>   drivers/md/raid5-cache.c |   8 +-
>>   drivers/md/raid5.c       |  62 ++---
>>   11 files changed, 752 insertions(+), 562 deletions(-)
>>
> 
> .
>
Yu Kuai Aug. 26, 2024, 1:43 a.m. UTC | #4
Hi,

在 2024/08/22 16:38, Xiao Ni 写道:
> On Thu, Aug 22, 2024 at 10:52 AM Yu Kuai <yukuai1@huaweicloud.com> wrote:
>>
>> From: Yu Kuai <yukuai3@huawei.com>
>>
>> Changes from RFC v1:
>>   - add patch 1-8 to prevent dereference bitmap directly, and the last
>>   patch to make bitmap structure internel.
>>   - use plain function alls "bitmap_ops->xxx()" directly;
>>
>> Changes from RFC v2:
>>   - some coding style.
>>
>> The background is that currently bitmap is using a global spin_lock,
>> cauing lock contention and huge IO performance degration for all raid
>> levels.
>>
>> However, it's impossible to implement a new lock free bitmap with
>> current situation that md-bitmap exposes the internal implementation
>> with lots of exported apis. Hence bitmap_operations is invented, to
>> describe bitmap core implementation, and a new bitmap can be introduced
>> with a new bitmap_operations, we only need to switch to the new one
>> during initialization.
>>
>> And with this we can build bitmap as kernel module, but that's not
>> our concern for now.
>>
>> This version was tested with mdadm tests. There are still few failed
>> tests in my VM, howerver, it's the test itself need to be fixed and
>> we're working on it.
> 
> Hi Kuai
> 
> Do you run lvm2 test regression tests? It's better to run lvm2
> regression tests for such a big change.

Not yet, again because there are not much functional changes. I can run
lvm2 test later.

> 
> And by the way, does this patch set have a conflict with patch set
> "[RFC V7] md/bitmap: Optimize lock contention". I haven't read the
> patches, it's an optimization for the bitmap lock too.

Of course there will be context conflict. After someone is applied, the
other one must rebase.

Thanks,
Kuai

> 
> Best Regards
> Xiao
>>
>> Yu Kuai (41):
>>    md/raid1: use md_bitmap_wait_behind_writes() in raid1_read_request()
>>    md/md-bitmap: replace md_bitmap_status() with a new helper
>>      md_bitmap_get_stats()
>>    md: use new helper md_bitmap_get_stats() in update_array_info()
>>    md/md-bitmap: add 'events_cleared' into struct md_bitmap_stats
>>    md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
>>    md/md-bitmap: add 'file_pages' into struct md_bitmap_stats
>>    md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct
>>      md_bitmap_stats
>>    md/md-cluster: use helper md_bitmap_get_stats() to get pages in
>>      resize_bitmaps()
>>    md/md-bitmap: add a new helper md_bitmap_set_pages()
>>    md/md-bitmap: introduce struct bitmap_operations
>>    md/md-bitmap: simplify md_bitmap_create() + md_bitmap_load()
>>    md/md-bitmap: merge md_bitmap_create() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_load() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_destroy() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_flush() into bitmap_operations
>>    md/md-bitmap: make md_bitmap_print_sb() internal
>>    md/md-bitmap: merge md_bitmap_update_sb() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_status() into bitmap_operations
>>    md/md-bitmap: remove md_bitmap_setallbits()
>>    md/md-bitmap: merge bitmap_write_all() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_dirty_bits() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_startwrite() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_endwrite() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations
>>    md/md-bitmap: remove the parameter 'aborted' for md_bitmap_end_sync()
>>    md/md-bitmap: merge md_bitmap_end_sync() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_close_sync() into bitmap_operations
>>    md/md-bitmap: mrege md_bitmap_cond_end_sync() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_sync_with_cluster() into
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_unplug_async() into md_bitmap_unplug()
>>    md/md-bitmap: merge bitmap_unplug() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_daemon_work() into bitmap_operations
>>    md/md-bitmap: pass in mddev directly for md_bitmap_resize()
>>    md/md-bitmap: merge md_bitmap_resize() into bitmap_operations
>>    md/md-bitmap: merge get_bitmap_from_slot() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_copy_from_slot() into struct
>>      bitmap_operation.
>>    md/md-bitmap: merge md_bitmap_set_pages() into struct
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_free() into bitmap_operations
>>    md/md-bitmap: merge md_bitmap_wait_behind_writes() into
>>      bitmap_operations
>>    md/md-bitmap: merge md_bitmap_enabled() into bitmap_operations
>>    md/md-bitmap: make in memory structure internal
>>
>>   drivers/md/dm-raid.c     |   7 +-
>>   drivers/md/md-bitmap.c   | 560 +++++++++++++++++++++++++++++----------
>>   drivers/md/md-bitmap.h   | 268 ++++---------------
>>   drivers/md/md-cluster.c  |  91 ++++---
>>   drivers/md/md.c          | 155 +++++++----
>>   drivers/md/md.h          |   3 +-
>>   drivers/md/raid1-10.c    |   9 +-
>>   drivers/md/raid1.c       |  78 +++---
>>   drivers/md/raid10.c      |  73 ++---
>>   drivers/md/raid5-cache.c |   8 +-
>>   drivers/md/raid5.c       |  62 ++---
>>   11 files changed, 752 insertions(+), 562 deletions(-)
>>
>> --
>> 2.39.2
>>
> 
> 
> 
> .
>