Re: [PATCH v3 1/1] md/raid1: serialize overlap io for writemostly disk
"Yu Kuai" <[email protected]>
| Newsgroups | gmane.linux.raid |
|---|---|
| Message-ID | <[email protected]> |
在 2026/3/24 15:24, Xiao Ni 写道: > Previously, using wait_event() would wake up all waiters simultaneously, > and they would compete for the tree lock. The bio which gets the lock > first will be handled, so the write sequence cannot be guaranteed. > > For example: > bio1(100,200) > bio2(150,200) > bio3(150,300) > > The write sequence of fast device is bio1,bio2,bio3. But the write sequence > of slow device could be bio1,bio3,bio2 due to lock competition. This causes > data corruption. > > Replace waitqueue with a fifo list to guarantee the write sequence. And it > also needs to iterate the list when removing one entry. If not, it may miss > the opportunity to wake up the waiting io. > > For example: > bio1(1,3), bio2(2,4) > bio3(5,7), bio4(6,8) > These four bios are in the same bucket. bio1 and bio3 are inserted into > the rbtree. bio2 and bio4 are added to the waiting list and bio2 is the > first one. bio3 returns from slow disk and tries to wake up the waiting > bios. bio2 is removed from the list and will be handled. But bio1 hasn't > finished. So bio2 will be added into waiting list again. Then bio1 returns > from slow disk and wakes up waiting bios. bio4 is removed from the list > and will be handled. Now bio1, bio3 and bio4 all finish and bio2 is left > on the waiting list. So it needs to iterate the waiting list to wake up > the right bio. > > Signed-off-by: Xiao Ni<[email protected]> > --- > v2: use prepare_to_wait_exclusive > v3: return back to self managed fifo list to find the right waiting node > drivers/md/md.c | 1 - > drivers/md/md.h | 5 ++++- > drivers/md/raid1.c | 45 ++++++++++++++++++++++++++++++++++----------- > 3 files changed, 38 insertions(+), 13 deletions(-) Applied to md-7.1 -- Thansk, Kuai