Changeset 4d42a1b in mainline


Ignore:
Timestamp:
2025-03-06T20:13:11Z (2 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
10005fd
Parents:
6123753
Message:

hr: remove deferred invalidations

Location:
uspace/srv/bd/hr
Files:
5 edited

Legend:

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

    r6123753 r4d42a1b  
    260260        fibril_mutex_initialize(&new_volume->range_lock_list_lock);
    261261
    262         fibril_mutex_initialize(&new_volume->deferred_list_lock);
    263         list_initialize(&new_volume->deferred_invalidations_list);
    264 
    265262        atomic_init(&new_volume->rebuild_blk, 0);
    266263        atomic_init(&new_volume->state_changed, false);
    267         atomic_init(&new_volume->pending_invalidation, false);
    268264
    269265        rc = new_volume->hr_ops.create(new_volume);
  • uspace/srv/bd/hr/raid1.c

    r6123753 r4d42a1b  
    228228                return;
    229229
    230         if (atomic_compare_exchange_strong(&vol->pending_invalidation, &exp,
    231             false)) {
    232                 fibril_mutex_lock(&vol->deferred_list_lock);
    233                 hr_process_deferred_invalidations(vol);
    234                 fibril_mutex_unlock(&vol->deferred_list_lock);
    235         }
    236 
    237230        fibril_rwlock_read_lock(&vol->extents_lock);
    238231        fibril_rwlock_read_lock(&vol->states_lock);
     
    289282        switch (rc) {
    290283        case ENOMEM:
    291                 fibril_mutex_lock(&vol->deferred_list_lock);
    292 
    293                 service_id_t invalid_svc_id = vol->extents[extent].svc_id;
    294 
    295                 list_foreach(vol->deferred_invalidations_list, link,
    296                     hr_deferred_invalidation_t, di) {
    297                         if (di->svc_id == invalid_svc_id) {
    298                                 assert(vol->extents[extent].status ==
    299                                     HR_EXT_INVALID);
    300                                 goto deferring_end;
    301                         }
    302                 }
    303 
    304                 assert(vol->extents[extent].svc_id != HR_EXT_INVALID);
    305 
    306284                hr_update_ext_status(vol, extent, HR_EXT_INVALID);
    307 
    308                 size_t i = list_count(&vol->deferred_invalidations_list);
    309                 vol->deferred_inval[i].svc_id = invalid_svc_id;
    310                 vol->deferred_inval[i].index = extent;
    311 
    312                 list_append(&vol->deferred_inval[i].link,
    313                     &vol->deferred_invalidations_list);
    314 
    315                 atomic_store(&vol->pending_invalidation, true);
    316         deferring_end:
    317 
    318                 fibril_mutex_unlock(&vol->deferred_list_lock);
    319285                break;
    320286        case ENOENT:
  • uspace/srv/bd/hr/util.c

    r6123753 r4d42a1b  
    410410}
    411411
    412 void hr_process_deferred_invalidations(hr_volume_t *vol)
    413 {
    414         HR_DEBUG("hr_raid1_update_vol_status(): deferred invalidations\n");
    415 
    416         fibril_mutex_lock(&vol->halt_lock);
    417         vol->halt_please = true;
    418         fibril_rwlock_write_lock(&vol->extents_lock);
    419         fibril_rwlock_write_lock(&vol->states_lock);
    420         fibril_mutex_lock(&vol->hotspare_lock);
    421 
    422         list_foreach(vol->deferred_invalidations_list, link,
    423             hr_deferred_invalidation_t, di) {
    424                 assert(vol->extents[di->index].status == HR_EXT_INVALID);
    425 
    426                 HR_DEBUG("moving invalidated extent no. %lu to hotspares\n",
    427                     di->index);
    428 
    429                 block_fini(di->svc_id);
    430 
    431                 size_t hs_idx = vol->hotspare_no;
    432 
    433                 vol->hotspare_no++;
    434 
    435                 hr_update_hotspare_svc_id(vol, hs_idx, di->svc_id);
    436                 hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE);
    437 
    438                 hr_update_ext_svc_id(vol, di->index, 0);
    439                 hr_update_ext_status(vol, di->index, HR_EXT_MISSING);
    440 
    441                 assert(vol->hotspare_no < HR_MAX_HOTSPARES + HR_MAX_EXTENTS);
    442         }
    443 
    444         for (size_t i = 0; i < HR_MAX_EXTENTS; i++) {
    445                 hr_deferred_invalidation_t *di = &vol->deferred_inval[i];
    446                 if (di->svc_id != 0) {
    447                         list_remove(&di->link);
    448                         di->svc_id = 0;
    449                 }
    450         }
    451 
    452         fibril_mutex_unlock(&vol->hotspare_lock);
    453         fibril_rwlock_write_unlock(&vol->states_lock);
    454         fibril_rwlock_write_unlock(&vol->extents_lock);
    455         vol->halt_please = false;
    456         fibril_mutex_unlock(&vol->halt_lock);
    457 }
    458 
    459412/** @}
    460413 */
  • uspace/srv/bd/hr/util.h

    r6123753 r4d42a1b  
    6767    uint64_t);
    6868extern void hr_range_lock_release(hr_range_lock_t *rl);
    69 extern void hr_process_deferred_invalidations(hr_volume_t *);
    7069
    7170#endif
  • uspace/srv/bd/hr/var.h

    r6123753 r4d42a1b  
    110110        fibril_mutex_t halt_lock;
    111111
    112         /*
    113          * For deferring invalidations of extents. Used when
    114          * an extent has to be invalidated (got ENOMEM on a WRITE),
    115          * but workers - therefore state callbacks cannot lock
    116          * extents for writing (they are readers), so invalidations
    117          * are harvested later when we are able to.
    118          */
    119         _Atomic bool pending_invalidation;
    120         fibril_mutex_t deferred_list_lock;
    121         list_t deferred_invalidations_list;
    122         hr_deferred_invalidation_t deferred_inval[HR_MAX_EXTENTS];
    123 
    124112        _Atomic bool state_changed;
    125113        _Atomic uint64_t rebuild_blk;
Note: See TracChangeset for help on using the changeset viewer.