Lines Matching refs:pm

63 rf_paritymap_status(struct rf_paritymap *pm, struct rf_pmstat *ps)  in rf_paritymap_status()  argument
66 if (pm == NULL) in rf_paritymap_status()
70 ps->region_size = pm->region_size; in rf_paritymap_status()
71 mutex_enter(&pm->lock); in rf_paritymap_status()
72 memcpy(&ps->params, &pm->params, sizeof(ps->params)); in rf_paritymap_status()
73 memcpy(ps->dirty, pm->disk_now, sizeof(ps->dirty)); in rf_paritymap_status()
74 memcpy(&ps->ctrs, &pm->ctrs, sizeof(ps->ctrs)); in rf_paritymap_status()
75 mutex_exit(&pm->lock); in rf_paritymap_status()
85 rf_paritymap_test(struct rf_paritymap *pm, daddr_t sector) in rf_paritymap_test() argument
87 unsigned region = sector / pm->region_size; in rf_paritymap_test()
90 mutex_enter(&pm->lock); in rf_paritymap_test()
91 retval = isset(pm->disk_boot->bits, region) ? 1 : 0; in rf_paritymap_test()
92 mutex_exit(&pm->lock); in rf_paritymap_test()
98 rf_paritymap_begin(struct rf_paritymap *pm, daddr_t offset, daddr_t size) in rf_paritymap_begin() argument
102 b = offset / pm->region_size; in rf_paritymap_begin()
103 e = (offset + size - 1) / pm->region_size; in rf_paritymap_begin()
106 rf_paritymap_begin_region(pm, i); in rf_paritymap_begin()
111 rf_paritymap_end(struct rf_paritymap *pm, daddr_t offset, daddr_t size) in rf_paritymap_end() argument
115 b = offset / pm->region_size; in rf_paritymap_end()
116 e = (offset + size - 1) / pm->region_size; in rf_paritymap_end()
119 rf_paritymap_end_region(pm, i); in rf_paritymap_end()
123 rf_paritymap_begin_region(struct rf_paritymap *pm, unsigned region) in rf_paritymap_begin_region() argument
128 pm->ctrs.nwrite++; in rf_paritymap_begin_region()
131 mutex_enter(&pm->lock); in rf_paritymap_begin_region()
132 if (pm->current->state[region] < 0) in rf_paritymap_begin_region()
133 pm->current->state[region] = 0; in rf_paritymap_begin_region()
136 KASSERT(pm->current->state[region] < 127); in rf_paritymap_begin_region()
137 pm->current->state[region]++; in rf_paritymap_begin_region()
139 needs_write = isclr(pm->disk_now->bits, region); in rf_paritymap_begin_region()
142 KASSERT(pm->current->state[region] == 1); in rf_paritymap_begin_region()
143 rf_paritymap_write_locked(pm); in rf_paritymap_begin_region()
146 mutex_exit(&pm->lock); in rf_paritymap_begin_region()
150 rf_paritymap_end_region(struct rf_paritymap *pm, unsigned region) in rf_paritymap_end_region() argument
154 mutex_enter(&pm->lock); in rf_paritymap_end_region()
155 KASSERT(pm->current->state[region] > 0); in rf_paritymap_end_region()
156 --pm->current->state[region]; in rf_paritymap_end_region()
158 if (pm->current->state[region] <= 0) { in rf_paritymap_end_region()
159 pm->current->state[region] = -pm->params.cooldown; in rf_paritymap_end_region()
160 KASSERT(pm->current->state[region] <= 0); in rf_paritymap_end_region()
161 mutex_enter(&pm->lk_flags); in rf_paritymap_end_region()
162 if (!(pm->flags & TICKING)) { in rf_paritymap_end_region()
163 pm->flags |= TICKING; in rf_paritymap_end_region()
164 mutex_exit(&pm->lk_flags); in rf_paritymap_end_region()
165 callout_schedule(&pm->ticker, in rf_paritymap_end_region()
166 mstohz(pm->params.tickms)); in rf_paritymap_end_region()
168 mutex_exit(&pm->lk_flags); in rf_paritymap_end_region()
170 mutex_exit(&pm->lock); in rf_paritymap_end_region()
179 rf_paritymap_write(struct rf_paritymap *pm) in rf_paritymap_write() argument
181 mutex_enter(&pm->lock); in rf_paritymap_write()
182 rf_paritymap_write_locked(pm); in rf_paritymap_write()
183 mutex_exit(&pm->lock); in rf_paritymap_write()
188 rf_paritymap_write_locked(struct rf_paritymap *pm) in rf_paritymap_write_locked() argument
195 w0 = pm->disk_now->bits[i]; in rf_paritymap_write_locked()
196 w = pm->disk_boot->bits[i]; in rf_paritymap_write_locked()
199 if (pm->current->state[i * NBBY + j] != 0) in rf_paritymap_write_locked()
207 pm->disk_now->bits[i] = w; in rf_paritymap_write_locked()
209 pm->ctrs.ncachesync += setting + clearing; in rf_paritymap_write_locked()
210 pm->ctrs.nclearing += clearing; in rf_paritymap_write_locked()
223 rf_sync_component_caches(pm->raid, 1); in rf_paritymap_write_locked()
224 rf_paritymap_kern_write(pm->raid, pm->disk_now); in rf_paritymap_write_locked()
226 rf_sync_component_caches(pm->raid, 1); in rf_paritymap_write_locked()
231 rf_paritymap_invalidate(struct rf_paritymap *pm) in rf_paritymap_invalidate() argument
233 mutex_enter(&pm->lock); in rf_paritymap_invalidate()
234 memset(pm->disk_boot, (unsigned char)~0, sizeof(*pm->disk_boot)); in rf_paritymap_invalidate()
235 mutex_exit(&pm->lock); in rf_paritymap_invalidate()
240 rf_paritymap_forceclean(struct rf_paritymap *pm) in rf_paritymap_forceclean() argument
242 mutex_enter(&pm->lock); in rf_paritymap_forceclean()
243 memset(pm->disk_boot, 0, sizeof(*pm->disk_boot)); in rf_paritymap_forceclean()
244 mutex_exit(&pm->lock); in rf_paritymap_forceclean()
255 struct rf_paritymap *pm = arg; in rf_paritymap_tick() local
257 mutex_enter(&pm->lk_flags); in rf_paritymap_tick()
258 pm->flags |= TICKED; in rf_paritymap_tick()
259 mutex_exit(&pm->lk_flags); in rf_paritymap_tick()
261 rf_lock_mutex2(pm->raid->iodone_lock); in rf_paritymap_tick()
262 rf_signal_cond2(pm->raid->iodone_cv); /* XXX */ in rf_paritymap_tick()
263 rf_unlock_mutex2(pm->raid->iodone_lock); in rf_paritymap_tick()
271 rf_paritymap_checkwork(struct rf_paritymap *pm) in rf_paritymap_checkwork() argument
275 mutex_enter(&pm->lk_flags); in rf_paritymap_checkwork()
276 if (pm->flags & TICKED) { in rf_paritymap_checkwork()
279 pm->flags &= ~TICKED; in rf_paritymap_checkwork()
280 mutex_exit(&pm->lk_flags); in rf_paritymap_checkwork()
282 mutex_enter(&pm->lock); in rf_paritymap_checkwork()
284 if (pm->current->state[i] < 0) { in rf_paritymap_checkwork()
286 pm->current->state[i]++; in rf_paritymap_checkwork()
287 if (pm->current->state[i] == 0) in rf_paritymap_checkwork()
293 callout_schedule(&pm->ticker, in rf_paritymap_checkwork()
294 mstohz(pm->params.tickms)); in rf_paritymap_checkwork()
296 mutex_enter(&pm->lk_flags); in rf_paritymap_checkwork()
297 pm->flags &= ~TICKING; in rf_paritymap_checkwork()
298 mutex_exit(&pm->lk_flags); in rf_paritymap_checkwork()
302 rf_paritymap_write_locked(pm); in rf_paritymap_checkwork()
303 mutex_exit(&pm->lock); in rf_paritymap_checkwork()
305 mutex_exit(&pm->lk_flags); in rf_paritymap_checkwork()
316 rf_paritymap_set_params(struct rf_paritymap *pm, in rf_paritymap_set_params() argument
326 ? params->cooldown : pm->params.cooldown; in rf_paritymap_set_params()
328 ? params->tickms : pm->params.tickms; in rf_paritymap_set_params()
330 ? params->regions : pm->params.regions; in rf_paritymap_set_params()
333 printf("raid%d: cooldown %d out of range\n", pm->raid->raidid, in rf_paritymap_set_params()
339 pm->raid->raidid, tickms); in rf_paritymap_set_params()
343 regions = rf_paritymap_nreg(pm->raid); in rf_paritymap_set_params()
346 pm->raid->raidid, regions, RF_PARITYMAP_NREG); in rf_paritymap_set_params()
351 pm->params.cooldown = cooldown; in rf_paritymap_set_params()
352 pm->params.tickms = tickms; in rf_paritymap_set_params()
354 if (pm->params.regions == 0) in rf_paritymap_set_params()
355 pm->params.regions = regions; in rf_paritymap_set_params()
358 pm->ctrs.nwrite = pm->ctrs.ncachesync = pm->ctrs.nclearing = 0; in rf_paritymap_set_params()
361 raidPtr = pm->raid; in rf_paritymap_set_params()
424 rf_paritymap_init(struct rf_paritymap *pm, RF_Raid_t *raid, in rf_paritymap_init() argument
430 pm->raid = raid; in rf_paritymap_init()
431 pm->params.regions = 0; in rf_paritymap_init()
432 if (0 != rf_paritymap_set_params(pm, params, 0)) { in rf_paritymap_init()
443 if (0 != rf_paritymap_set_params(pm, &safe, 0)) in rf_paritymap_init()
447 rstripes = howmany(raid->Layout.numStripe, pm->params.regions); in rf_paritymap_init()
448 pm->region_size = rstripes * raid->Layout.dataSectorsPerStripe; in rf_paritymap_init()
450 callout_init(&pm->ticker, CALLOUT_MPSAFE); in rf_paritymap_init()
451 callout_setfunc(&pm->ticker, rf_paritymap_tick, pm); in rf_paritymap_init()
452 pm->flags = 0; in rf_paritymap_init()
454 pm->disk_boot = kmem_alloc(sizeof(struct rf_paritymap_ondisk), in rf_paritymap_init()
456 pm->disk_now = kmem_alloc(sizeof(struct rf_paritymap_ondisk), in rf_paritymap_init()
458 pm->current = kmem_zalloc(sizeof(struct rf_paritymap_current), in rf_paritymap_init()
461 rf_paritymap_kern_read(pm->raid, pm->disk_boot); in rf_paritymap_init()
462 memcpy(pm->disk_now, pm->disk_boot, sizeof(*pm->disk_now)); in rf_paritymap_init()
464 mutex_init(&pm->lock, MUTEX_DEFAULT, IPL_NONE); in rf_paritymap_init()
465 mutex_init(&pm->lk_flags, MUTEX_DEFAULT, IPL_SOFTCLOCK); in rf_paritymap_init()
475 rf_paritymap_destroy(struct rf_paritymap *pm, int force) in rf_paritymap_destroy() argument
479 callout_halt(&pm->ticker, NULL); /* XXX stop? halt? */ in rf_paritymap_destroy()
480 callout_destroy(&pm->ticker); in rf_paritymap_destroy()
485 if (pm->current->state[i] < 0) in rf_paritymap_destroy()
486 pm->current->state[i] = 0; in rf_paritymap_destroy()
489 rf_paritymap_write_locked(pm); in rf_paritymap_destroy()
492 mutex_destroy(&pm->lock); in rf_paritymap_destroy()
493 mutex_destroy(&pm->lk_flags); in rf_paritymap_destroy()
495 kmem_free(pm->disk_boot, sizeof(struct rf_paritymap_ondisk)); in rf_paritymap_destroy()
496 kmem_free(pm->disk_now, sizeof(struct rf_paritymap_ondisk)); in rf_paritymap_destroy()
497 kmem_free(pm->current, sizeof(struct rf_paritymap_current)); in rf_paritymap_destroy()
510 rf_paritymap_rewrite(struct rf_paritymap *pm) in rf_paritymap_rewrite() argument
516 for (i = 0; i < pm->params.regions; i++) { in rf_paritymap_rewrite()
517 mutex_enter(&pm->lock); in rf_paritymap_rewrite()
518 if (isset(pm->disk_boot->bits, i)) { in rf_paritymap_rewrite()
519 mutex_exit(&pm->lock); in rf_paritymap_rewrite()
521 reg_b = i * pm->region_size; in rf_paritymap_rewrite()
522 reg_e = reg_b + pm->region_size; in rf_paritymap_rewrite()
523 if (reg_e > pm->raid->totalSectors) in rf_paritymap_rewrite()
524 reg_e = pm->raid->totalSectors; in rf_paritymap_rewrite()
526 if (rf_RewriteParityRange(pm->raid, reg_b, in rf_paritymap_rewrite()
529 if (pm->raid->waitShutdown) in rf_paritymap_rewrite()
532 mutex_enter(&pm->lock); in rf_paritymap_rewrite()
533 clrbit(pm->disk_boot->bits, i); in rf_paritymap_rewrite()
534 rf_paritymap_write_locked(pm); in rf_paritymap_rewrite()
535 mutex_exit(&pm->lock); in rf_paritymap_rewrite()
538 mutex_exit(&pm->lock); in rf_paritymap_rewrite()
543 rf_paritymap_forceclean(pm); in rf_paritymap_rewrite()
544 rf_paritymap_write(pm); in rf_paritymap_rewrite()
587 struct rf_paritymap *pm = raidPtr->parity_map; in rf_paritymap_detach() local
591 rf_paritymap_destroy(pm, 0); in rf_paritymap_detach()
592 kmem_free(pm, sizeof(*pm)); in rf_paritymap_detach()
732 rf_paritymap_init_label(struct rf_paritymap *pm, RF_ComponentLabel_t *clabel) in rf_paritymap_init_label() argument
734 if (pm != NULL) { in rf_paritymap_init_label()
737 clabel->parity_map_tickms = pm->params.tickms; in rf_paritymap_init_label()
738 clabel->parity_map_ntick = pm->params.cooldown; in rf_paritymap_init_label()
745 clabel->parity_map_regions = pm->params.regions; in rf_paritymap_init_label()