Changeset 9323bb8 in mainline


Ignore:
Timestamp:
2025-07-07T16:04:02Z (3 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
f7169a6
Parents:
15e51b05
Message:

hr: raid5.c: make the critical section smaller

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/raid5.c

    r15e51b05 r9323bb8  
    9898        }
    9999
    100         bd_srvs_init(&new_volume->hr_bds);
    101         new_volume->hr_bds.ops = &hr_raid5_bd_ops;
    102         new_volume->hr_bds.sarg = new_volume;
    103 
    104100        hr_raid5_vol_state_eval_forced(new_volume);
    105101
     
    113109        }
    114110
     111        bd_srvs_init(&new_volume->hr_bds);
     112        new_volume->hr_bds.ops = &hr_raid5_bd_ops;
     113        new_volume->hr_bds.sarg = new_volume;
     114
    115115        return EOK;
    116116}
     
    241241            stripes_cnt, false);
    242242
     243        uint64_t phys_block, len;
     244        size_t left;
     245
     246        hr_layout_t layout = vol->layout;
     247        hr_level_t level = vol->level;
     248
     249        /* parity extent */
     250        size_t p_extent = hr_raid5_parity_extent(level, layout,
     251            vol->extent_no, strip_no);
     252
     253        uint64_t strip_off = ba % strip_size;
     254
     255        left = cnt;
     256
     257        while (left != 0) {
     258                if (level == HR_LVL_5) {
     259                        p_extent = hr_raid5_parity_extent(level, layout,
     260                            vol->extent_no, strip_no);
     261                }
     262
     263                size_t extent = hr_raid5_data_extent(level, layout,
     264                    vol->extent_no, strip_no, p_extent);
     265
     266                uint64_t stripe_no = strip_no / (vol->extent_no - 1);
     267                size_t relative_si = stripe_no - start_stripe; /* relative stripe index */
     268                hr_stripe_t *stripe = &stripes[relative_si];
     269                stripe->p_extent = p_extent;
     270
     271                stripe->strips_touched++;
     272
     273                phys_block = stripe_no * strip_size + strip_off;
     274                cnt = min(left, strip_size - strip_off);
     275                len = vol->bsize * cnt;
     276                hr_add_data_offset(vol, &phys_block);
     277
     278                stripe->extent_span[extent].range.start = phys_block;
     279                stripe->extent_span[extent].range.end = phys_block + cnt - 1;
     280                stripe->extent_span[extent].cnt = cnt;
     281                stripe->extent_span[extent].data_read = data_read;
     282                stripe->extent_span[extent].strip_off = strip_off;
     283
     284                data_read += len;
     285                left -= cnt;
     286                strip_off = 0;
     287                strip_no++;
     288        }
     289
    243290        hr_range_lock_t **rlps = hr_malloc_waitok(stripes_cnt * sizeof(*rlps));
    244291
     
    252299                uint64_t relative = s - start_stripe;
    253300                rlps[relative] = hr_range_lock_acquire(vol, s, 1);
    254         }
    255 
    256         uint64_t phys_block, len;
    257         size_t left;
    258 
    259         hr_layout_t layout = vol->layout;
    260         hr_level_t level = vol->level;
    261 
    262         /* parity extent */
    263         size_t p_extent = hr_raid5_parity_extent(level, layout,
    264             vol->extent_no, strip_no);
    265 
    266         uint64_t strip_off = ba % strip_size;
    267 
    268         left = cnt;
    269 
    270         while (left != 0) {
    271                 if (level == HR_LVL_5) {
    272                         p_extent = hr_raid5_parity_extent(level, layout,
    273                             vol->extent_no, strip_no);
    274                 }
    275 
    276                 size_t extent = hr_raid5_data_extent(level, layout,
    277                     vol->extent_no, strip_no, p_extent);
    278 
    279                 uint64_t stripe_no = strip_no / (vol->extent_no - 1);
    280                 size_t relative_si = stripe_no - start_stripe; /* relative stripe index */
    281                 hr_stripe_t *stripe = &stripes[relative_si];
    282                 stripe->p_extent = p_extent;
    283 
    284                 stripe->strips_touched++;
    285 
    286                 phys_block = stripe_no * strip_size + strip_off;
    287                 cnt = min(left, strip_size - strip_off);
    288                 len = vol->bsize * cnt;
    289                 hr_add_data_offset(vol, &phys_block);
    290 
    291                 stripe->extent_span[extent].range.start = phys_block;
    292                 stripe->extent_span[extent].range.end = phys_block + cnt - 1;
    293                 stripe->extent_span[extent].cnt = cnt;
    294                 stripe->extent_span[extent].data_read = data_read;
    295                 stripe->extent_span[extent].strip_off = strip_off;
    296 
    297                 data_read += len;
    298                 left -= cnt;
    299                 strip_off = 0;
    300                 strip_no++;
    301301        }
    302302
     
    452452        }
    453453
     454        uint64_t phys_block, len;
     455        size_t left;
     456
     457        hr_layout_t layout = vol->layout;
     458        hr_level_t level = vol->level;
     459
     460        /* parity extent */
     461        size_t p_extent = hr_raid5_parity_extent(level, layout,
     462            vol->extent_no, strip_no);
     463
     464        uint64_t strip_off = ba % strip_size;
     465
     466        left = cnt;
     467
     468        while (left != 0) {
     469                if (level == HR_LVL_5) {
     470                        p_extent = hr_raid5_parity_extent(level, layout,
     471                            vol->extent_no, strip_no);
     472                }
     473
     474                size_t extent = hr_raid5_data_extent(level, layout,
     475                    vol->extent_no, strip_no, p_extent);
     476
     477                uint64_t stripe_no = strip_no / (vol->extent_no - 1);
     478                size_t relative_si = stripe_no - start_stripe; /* relative stripe index */
     479                hr_stripe_t *stripe = &stripes[relative_si];
     480                stripe->p_extent = p_extent;
     481
     482                phys_block = stripe_no * strip_size + strip_off;
     483                cnt = min(left, strip_size - strip_off);
     484                len = vol->bsize * cnt;
     485                hr_add_data_offset(vol, &phys_block);
     486
     487                stripe->extent_span[extent].range.start = phys_block;
     488                stripe->extent_span[extent].range.end = phys_block + cnt - 1;
     489                stripe->extent_span[extent].cnt = cnt;
     490                stripe->extent_span[extent].data_write = data_write;
     491                stripe->extent_span[extent].strip_off = strip_off;
     492
     493                data_write += len;
     494                left -= cnt;
     495                strip_off = 0;
     496                strip_no++;
     497        }
     498
    454499        hr_range_lock_t **rlps = hr_malloc_waitok(stripes_cnt * sizeof(*rlps));
    455500
     
    463508                uint64_t relative = s - start_stripe;
    464509                rlps[relative] = hr_range_lock_acquire(vol, s, 1);
    465         }
    466 
    467         uint64_t phys_block, len;
    468         size_t left;
    469 
    470         hr_layout_t layout = vol->layout;
    471         hr_level_t level = vol->level;
    472 
    473         /* parity extent */
    474         size_t p_extent = hr_raid5_parity_extent(level, layout,
    475             vol->extent_no, strip_no);
    476 
    477         uint64_t strip_off = ba % strip_size;
    478 
    479         left = cnt;
    480 
    481         while (left != 0) {
    482                 if (level == HR_LVL_5) {
    483                         p_extent = hr_raid5_parity_extent(level, layout,
    484                             vol->extent_no, strip_no);
    485                 }
    486 
    487                 size_t extent = hr_raid5_data_extent(level, layout,
    488                     vol->extent_no, strip_no, p_extent);
    489 
    490                 uint64_t stripe_no = strip_no / (vol->extent_no - 1);
    491                 size_t relative_si = stripe_no - start_stripe; /* relative stripe index */
    492                 hr_stripe_t *stripe = &stripes[relative_si];
    493                 stripe->p_extent = p_extent;
    494 
    495                 phys_block = stripe_no * strip_size + strip_off;
    496                 cnt = min(left, strip_size - strip_off);
    497                 len = vol->bsize * cnt;
    498                 hr_add_data_offset(vol, &phys_block);
    499 
    500                 stripe->extent_span[extent].range.start = phys_block;
    501                 stripe->extent_span[extent].range.end = phys_block + cnt - 1;
    502                 stripe->extent_span[extent].cnt = cnt;
    503                 stripe->extent_span[extent].data_write = data_write;
    504                 stripe->extent_span[extent].strip_off = strip_off;
    505 
    506                 data_write += len;
    507                 left -= cnt;
    508                 strip_off = 0;
    509                 strip_no++;
    510510        }
    511511
Note: See TracChangeset for help on using the changeset viewer.